libraries
library(tidyverse)
package ‘tidyverse’ was built under R version 4.0.2Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
[30m── [1mAttaching packages[22m ──────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──[39m
[30m[32m✓[30m [34mggplot2[30m 3.3.3 [32m✓[30m [34mpurrr [30m 0.3.4
[32m✓[30m [34mtibble [30m 3.1.1 [32m✓[30m [34mdplyr [30m 1.0.6
[32m✓[30m [34mtidyr [30m 1.1.3 [32m✓[30m [34mstringr[30m 1.4.0
[32m✓[30m [34mreadr [30m 1.4.0 [32m✓[30m [34mforcats[30m 0.5.1[39m
package ‘ggplot2’ was built under R version 4.0.2package ‘tibble’ was built under R version 4.0.2package ‘tidyr’ was built under R version 4.0.2package ‘readr’ was built under R version 4.0.2package ‘dplyr’ was built under R version 4.0.2package ‘forcats’ was built under R version 4.0.2[30m── [1mConflicts[22m ─────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
[31mx[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31mx[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()[39m
library(ggplot2)
library(dbplyr)
package ‘dbplyr’ was built under R version 4.0.2
Attaching package: ‘dbplyr’
The following objects are masked from ‘package:dplyr’:
ident, sql
library(lmerTest)
package ‘lmerTest’ was built under R version 4.0.2Loading required package: lme4
package ‘lme4’ was built under R version 4.0.2Loading required package: Matrix
Attaching package: ‘Matrix’
The following objects are masked from ‘package:tidyr’:
expand, pack, unpack
Attaching package: ‘lmerTest’
The following object is masked from ‘package:lme4’:
lmer
The following object is masked from ‘package:stats’:
step
library(languageR)
package ‘languageR’ was built under R version 4.0.2
library(lme4)
library(wesanderson)
package ‘wesanderson’ was built under R version 4.0.2
cbPalette <- c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "D55E00", "#CC79A7")
source("helpers.r")
package ‘bootstrap’ was built under R version 4.0.2
data filtering
data = read.csv("main-trials.csv")
demo = read.csv("main-subject_information.csv")
data <- data %>%
left_join(demo, by="workerid")
data = data %>%
filter(attention_response != "NA" & item_type != "example3") %>%
mutate(attention_pass = ifelse(attention_response == attention_correct_response, 1, 0)) %>%
arrange(workerid)
attention_exclusion = data %>%
group_by(workerid) %>%
summarize(accuracy = mean(attention_pass)) %>%
mutate(exclude = ifelse(accuracy < 0.8, "yes", "no")) %>%
filter(exclude == "yes")
attention_correct = data %>%
group_by(workerid) %>%
summarize(accuracy = mean(attention_pass)) %>%
mutate(exclude = ifelse(accuracy < 0.8, "yes", "no")) %>%
filter(exclude == "no")
nonnative = demo %>%
filter(native != "yes")
experiment completion times before exclusions
data %>%
group_by(workerid) %>%
summarize(time = mean(Answer.time_in_minutes)) %>%
ggplot(aes(x=time)) +
geom_histogram() +
xlab("Average completion time") +
ylab("Number of cases") +
theme_bw()

Excluding from data frames
data = data[!(data$workerid %in% attention_exclusion$workerid),]
data = data[!(data$workerid %in% nonnative$workerid),]
demo = demo[!(demo$workerid %in% attention_exclusion$workerid),]
demo = demo[!(demo$workerid %in% nonnative$workerid),]
Time exclusions after filtering data based on attention checks and native language
time_exclusions = data %>%
group_by(workerid) %>%
summarize(time = mean(Answer.time_in_minutes)) %>%
filter(time < 10)
length(unique(time_exclusions$workerid))
[1] 9
experiment completion times before time exclusions
data %>%
group_by(workerid) %>%
summarize(time = mean(Answer.time_in_minutes)) %>%
ggplot(aes(x=time)) +
geom_histogram() +
xlab("Average completion time") +
ylab("Number of cases") +
theme_bw()

data = data[!(data$workerid %in% time_exclusions$workerid),]
demo = demo[!(demo$workerid %in% time_exclusions$workerid),]
double check demo and data are the same
length(demo$workerid)
[1] 131
length(unique(data$workerid))
[1] 131
write.csv(demo, "demo.csv")
change character variable to factor variables
data = data %>%
mutate(age = as.numeric(age)) %>%
mutate_if(is.character,as.factor)
NAs introduced by coercion
demo = demo %>%
mutate(age = as.numeric(age))
NAs introduced by coercion
demo = demo %>%
mutate_if(is.character,as.factor)
Main data visualizations
Set the background to be white instead of gray.
theme_set(theme_bw())
experiment completion times
data %>%
group_by(workerid) %>%
summarize(time = mean(Answer.time_in_minutes)) %>%
ggplot(aes(x=time)) +
geom_histogram() +
xlab("Average completion time") +
ylab("Number of cases") +
theme_bw()

Filtering data by critical and filler trials. droplevels() gets rid of unused factor levels (i.e. “filler” in data_critical)
data_critical = data %>%
filter(trial_type == "critical") %>%
droplevels()
data_filler = data %>%
filter(trial_type == "filler")
data_critical %>%
group_by(context_condition, DA_presence) %>%
summarize(mean_felicity = mean(felicity_rating), CI.Low = ci.low(felicity_rating), CI.High = ci.high(felicity_rating)) %>%
mutate(YMin = mean_felicity - CI.Low, YMax = mean_felicity + CI.High) %>%
ggplot(aes(x=reorder(context_condition, mean_felicity), y=mean_felicity, fill = DA_presence)) +
geom_bar(stat = "identity", position = dodge) +
#geom_jitter(data=data_critical,aes(y=felicity_rating),alpha=.5,color="lightblue") +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
labs (x="Context Condition", y= "Mean Felicity Rating", fill = "DA Presence") +
scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_manual(values = cbPalette) +
scale_fill_manual(labels=c("DA", "no DA"), values = wes_palette("FantasticFox1")[2:4]) +
geom_text(aes(label = mean_felicity), size = 3) +
theme(axis.text.x = element_text(vjust = 0.7))
`summarise()` has grouped output by 'context_condition'. You can override using the `.groups` argument.
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing
scale.

ggsave(file = "graphs/felicity_barplot.png",width=5,height=4)
data_critical %>%
group_by(DA_presence, context_condition) %>%
summarize(mean_felicity = mean(felicity_rating), CI.Low = ci.low(felicity_rating), CI.High = ci.high(felicity_rating)) %>%
mutate(YMin = mean_felicity - CI.Low, YMax = mean_felicity + CI.High) %>%
ggplot(aes(x=DA_presence, y=mean_felicity, fill = context_condition)) +
geom_bar(stat = "identity", position = dodge) +
#geom_jitter(data=data_critical,aes(y=felicity_rating),alpha=.5,color="lightblue") +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
labs (x="Context Condition", y= "Mean Felicity Rating", fill = "DA Presence") +
scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_manual(values = cbPalette) +
scale_fill_manual(values = wes_palette("FantasticFox1")[2:4]) +
#geom_text(aes(label = mean_felicity), size = 3) +
theme(axis.text.x = element_text(vjust = 0.7))
`summarise()` has grouped output by 'DA_presence'. You can override using the `.groups` argument.
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing
scale.


data_critical %>%
group_by(context_condition, DA_presence) %>%
ggplot(aes(x = context_condition,y=felicity_rating, fill = DA_presence)) +
geom_boxplot() +
labs (x="Context Condition", y= "Felicity Rating", fill = "DA Presence") +
scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_discrete(labels=c("DA", "no DA")) +
scale_fill_manual(values = wes_palette("FantasticFox1")[2:4])
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale.

data_critical %>%
group_by(context_condition, DA_presence) %>%
summarize(mean_affect = mean(affect_rating), CI.Low = ci.low(affect_rating), CI.High = ci.high(affect_rating)) %>%
mutate(YMin = mean_affect - CI.Low, YMax = mean_affect + CI.High) %>%
ggplot(aes(x=reorder(context_condition, mean_affect), y=mean_affect, fill = DA_presence)) +
geom_bar(stat = "identity", position = dodge) +
#geom_jitter(data=data_critical,aes(y=affect_rating),alpha=.5,color="lightblue") +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
labs (x="Context Condition", y= "Mean Affect Rating", fill = "DA Presence") +
scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
#scale_fill_manual(values = cbPalette) +
scale_fill_manual(labels=c("DA", "no DA"), values = wes_palette("FantasticFox1")[2:4]) +
geom_text(aes(label = mean_affect), size = 3) +
theme(axis.text.x = element_text(vjust = 0.7))
`summarise()` has grouped output by 'context_condition'. You can override using the `.groups` argument.

ggsave(file = "graphs/affect_barplot.png",width=5,height=4)
data_critical %>%
group_by(context_condition, DA_presence) %>%
ggplot(aes(x = context_condition,y=affect_rating, fill = DA_presence)) +
geom_boxplot() +
labs (x="Context Condition", y= "Affect Rating", fill = "DA Presence") +
scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_discrete(labels=c("DA", "no DA")) +
scale_fill_manual(values = wes_palette("FantasticFox1")[2:4])
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale.


dodge = position_dodge(.9)
data %>%
group_by(context_condition, DA_presence) %>%
summarize(mean_felicity = mean(felicity_rating), CI.Low = ci.low(felicity_rating), CI.High = ci.high(felicity_rating)) %>%
mutate(YMin = mean_felicity - CI.Low, YMax = mean_felicity + CI.High) %>%
ggplot(aes(x=context_condition, y=mean_felicity, fill = DA_presence)) +
geom_bar(stat = "identity", position = dodge) +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
#scale_fill_manual(values = cbPalette) +
theme_bw() +
theme(axis.text.x = element_text(vjust = 0.7))
`summarise()` has grouped output by 'context_condition'. You can override using the `.groups` argument.

dodge = position_dodge(.9)
data %>%
group_by(context_condition, DA_presence) %>%
summarize(mean_affect = mean(affect_rating), CI.Low = ci.low(affect_rating), CI.High = ci.high(affect_rating)) %>%
mutate(YMin = mean_affect - CI.Low, YMax = mean_affect + CI.High) %>%
ggplot(aes(x=context_condition, y=mean_affect, fill = DA_presence)) +
geom_bar(stat = "identity", position = dodge) +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
#scale_fill_manual(values = cbPalette) +
theme_bw() +
theme(axis.text.x = element_text(vjust = 0.7))
`summarise()` has grouped output by 'context_condition'. You can override using the `.groups` argument.

data %>%
group_by(condition) %>%
summarize(mean_affect = mean(affect_rating)) %>%
ggplot(aes(x=reorder(condition,mean_affect), y=mean_affect)) +
geom_bar(stat = "identity") +
theme_bw() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.7))

data_critical %>%
ggplot(aes(x = affect_rating, y = felicity_rating, color = condition)) +
geom_point() +
geom_smooth(method="lm") +
theme_bw()

data %>%
group_by(condition) %>%
summarize(mean_affect = mean(affect_rating), mean_felicity = mean(felicity_rating)) %>%
ggplot(aes(x = mean_affect, y = mean_felicity, color = condition)) +
geom_point() +
theme_bw()

data_critical %>%
group_by(context_condition, DA_presence) %>%
summarize(mean_affect = mean(affect_rating), mean_felicity = mean(felicity_rating)) %>%
ggplot(aes(x = mean_affect, y = mean_felicity, color = DA_presence, shape = context_condition)) +
geom_point(size =3) +
theme_bw()
`summarise()` has grouped output by 'context_condition'. You can override using the `.groups` argument.

data_critical %>%
group_by(context_condition, DA_presence, item_type) %>%
summarize(mean_affect = mean(affect_rating), mean_felicity = mean(felicity_rating)) %>%
ggplot(aes(x = mean_affect, y = mean_felicity, color = DA_presence, shape = context_condition, group = DA_presence)) +
geom_point(size =3) +
geom_smooth(method = "lm") +
theme_bw()
`summarise()` has grouped output by 'context_condition', 'DA_presence'. You can override using the `.groups` argument.

Variation by item types
data_critical %>%
group_by(context_condition, DA_presence, item_type) %>%
summarize(mean_affect = mean(affect_rating), mean_felicity = mean(felicity_rating)) %>%
ggplot(aes(x = mean_affect, y = mean_felicity, color = DA_presence, shape = context_condition, group = DA_presence, label = item_type)) +
geom_point(size =3) +
geom_text() +
geom_smooth(method = "lm")
`summarise()` has grouped output by 'context_condition', 'DA_presence'. You can override using the `.groups` argument.

data_critical %>%
group_by(context_condition, DA_presence, item_type) %>%
ggplot(aes(x = context_condition,y=felicity_rating, fill = DA_presence)) +
geom_boxplot() +
labs (x="Context Condition", y= "Felicity Rating", fill = "DA Presence") +
scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_discrete(labels=c("DA", "no DA")) +
scale_fill_manual(values = wes_palette("FantasticFox1")[2:4]) +
facet_wrap(~item_type)
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale.

data_critical %>%
group_by(context_condition, DA_presence, item_type) %>%
ggplot(aes(x = context_condition,y=affect_rating, fill = DA_presence)) +
geom_boxplot() +
labs (x="Context Condition", y= "Affect Rating", fill = "DA Presence") +
scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_discrete(labels=c("DA", "no DA")) +
facet_wrap(~item_type)

data_critical %>%
group_by(DA_presence, item_type) %>%
ggplot(aes(x = item_type,y=felicity_rating, fill = DA_presence)) +
geom_boxplot() +
labs (x="Item Type", y= "Felicity Rating", fill = "DA Presence") +
#scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_discrete(labels=c("DA", "no DA"))

data_critical %>%
group_by(DA_presence, item_type) %>%
ggplot(aes(x = item_type,y=affect_rating, fill = DA_presence)) +
geom_boxplot() +
labs (x="Item Type", y= "Affect Rating", fill = "DA Presence") +
#scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_discrete(labels=c("DA", "no DA"))

Plot the felcity and affect ratings for each item_type by using facets.
ggplot(data, aes(x=affect_rating,y=felicity_rating, color=condition)) +
geom_point() +
geom_smooth(method="lm") +
facet_wrap(~item_type)

Plot the felcity and affect ratings for each item_type by using facets.
ggplot(data_critical, aes(x=affect_rating,y=felicity_rating, color=condition)) +
geom_point() +
#geom_smooth(method="lm") +
geom_smooth() +
facet_wrap(~item_type)

ggplot(data_critical, aes(x=affect_rating,y=felicity_rating, color=context_condition)) +
geom_point() +
geom_smooth(method="lm") +
facet_wrap(~item_type)

ggplot(data_filler, aes(x=affect_rating,y=felicity_rating, color=context_condition)) +
geom_point() +
geom_smooth(method="lm") +
facet_wrap(~item_type)



ggsave(file = "graphs/DA_by_item_type.png",width=10,height=7)
ggplot(data_critical, aes(x=affect_rating,y=felicity_rating, color=DA_presence)) +
geom_point() +
geom_smooth(method="lm") +
#geom_smooth() +
labs (x="Affect Rating", y= "Felicity Rating", color = "DA Presence") +
#scale_color_discrete(labels=c("DA", "no DA"), values = wes_palette("FantasticFox1")[2:4]) +
scale_color_manual(values = cbPalette) +
facet_wrap(~referent_gender)

ggplot(data_critical, aes(x=affect_rating,y=felicity_rating, color=DA_presence)) +
geom_point() +
geom_smooth(method="lm") +
#geom_smooth() +
labs (x="Affect Rating", y= "Felicity Rating", color = "DA Presence") +
#scale_color_discrete(labels=c("DA", "no DA"), values = wes_palette("FantasticFox1")[2:4]) +
scale_color_manual(values = cbPalette) +
facet_grid(rows = vars(item_type), cols = vars(referent_gender))

dodge = position_dodge(.9)
data_critical %>%
group_by(referent_gender, DA_presence, item_type) %>%
summarize(mean_felicity = mean(felicity_rating), CI.Low = ci.low(felicity_rating), CI.High = ci.high(felicity_rating)) %>%
mutate(YMin = mean_felicity - CI.Low, YMax = mean_felicity + CI.High) %>%
ggplot(aes(x=referent_gender, y=mean_felicity, fill = DA_presence)) +
geom_bar(stat = "identity", position = dodge) +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
#scale_fill_manual(values = cbPalette) +
theme_bw() +
theme(axis.text.x = element_text(vjust = 0.7)) +
facet_wrap(~item_type)
`summarise()` has grouped output by 'referent_gender', 'DA_presence'. You can override using the `.groups` argument.

data_critical %>%
group_by(DA_presence, referent_gender) %>%
ggplot(aes(x = referent_gender,y=felicity_rating, fill = DA_presence)) +
geom_boxplot() +
#labs (x="Context Condition", y= "Felicity Rating", fill = "DA Presence") +
#scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_discrete(labels=c("DA", "no DA")) +
scale_fill_manual(values = wes_palette("FantasticFox1")[2:4])
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale.

data_critical %>%
group_by(DA_presence, referent_gender) %>%
ggplot(aes(x = referent_gender,y=affect_rating, fill = DA_presence)) +
geom_boxplot() +
#labs (x="Context Condition", y= "Felicity Rating", fill = "DA Presence") +
#scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_discrete(labels=c("DA", "no DA")) +
scale_fill_manual(values = wes_palette("FantasticFox1")[2:4])
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale.

dodge = position_dodge(.9)
data_critical %>%
group_by(context_condition, DA_presence, item_type) %>%
summarize(mean_felicity = mean(felicity_rating), CI.Low = ci.low(felicity_rating), CI.High = ci.high(felicity_rating)) %>%
mutate(YMin = mean_felicity - CI.Low, YMax = mean_felicity + CI.High) %>%
ggplot(aes(x=context_condition, y=mean_felicity, fill = DA_presence)) +
geom_bar(stat = "identity", position = dodge) +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
#scale_fill_manual(values = cbPalette) +
theme_bw() +
theme(axis.text.x = element_text(vjust = 0.7)) +
facet_wrap(~item_type)
`summarise()` has grouped output by 'context_condition', 'DA_presence'. You can override using the `.groups` argument.

dodge = position_dodge(.9)
data_critical %>%
group_by(context_condition, DA_presence, item_type) %>%
summarize(mean_affect = mean(affect_rating), CI.Low = ci.low(affect_rating), CI.High = ci.high(affect_rating)) %>%
mutate(YMin = mean_affect - CI.Low, YMax = mean_affect + CI.High) %>%
ggplot(aes(x=context_condition, y=mean_affect, fill = DA_presence)) +
geom_bar(stat = "identity", position = dodge) +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
#scale_fill_manual(values = cbPalette) +
theme_bw() +
theme(axis.text.x = element_text(vjust = 0.7)) +
facet_wrap(~item_type)
`summarise()` has grouped output by 'context_condition', 'DA_presence'. You can override using the `.groups` argument.

Exploratory data visualizations for social variables
data %>%
group_by(region_country) %>%
ggplot(aes(x = fct_infreq(region_country), fill=region_country)) +
geom_bar(stat = 'count') +
theme(axis.text.x = element_text(angle = 90, vjust = 0.7)) +
scale_fill_manual(values = wes_palette("Zissou1", 15, type = "continuous")) +
theme(legend.position = "none")

demo %>%
group_by(region_country) %>%
ggplot(aes(x = fct_infreq(region_country), fill=region_country)) +
geom_bar(stat = 'count') +
theme(axis.text.x = element_text(angle = 45, vjust = 0.7)) +
scale_fill_manual(values = wes_palette("Zissou1", 15, type = "continuous")) +
theme(legend.position = "none") +
labs (x="Country", y= "Number of Participants")

ggsave(file = "graphs/participants_country.png",width=5,height=4)
dodge = position_dodge(.9)
data_critical %>%
group_by(context_condition, DA_presence, region_country) %>%
summarize(mean_felicity = mean(felicity_rating), CI.Low = ci.low(felicity_rating), CI.High = ci.high(felicity_rating)) %>%
mutate(YMin = mean_felicity - CI.Low, YMax = mean_felicity + CI.High) %>%
ggplot(aes(x=context_condition, y=mean_felicity, fill = DA_presence)) +
geom_bar(stat = "identity", position = dodge) +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
#scale_fill_manual(values = cbPalette) +
theme_bw() +
theme(axis.text.x = element_text(vjust = 0.7)) +
facet_wrap(~region_country)
`summarise()` has grouped output by 'context_condition', 'DA_presence'. You can override using the `.groups` argument.

data_critical %>%
group_by(context_condition, DA_presence, region_country) %>%
summarize(mean_affect = mean(affect_rating), mean_felicity = mean(felicity_rating), trial_sum = n()) %>%
ggplot(aes(x = mean_affect, y = mean_felicity, color = DA_presence, shape = context_condition, size = trial_sum)) +
geom_point() +
facet_wrap(~region_country) +
theme_bw()
`summarise()` has grouped output by 'context_condition', 'DA_presence'. You can override using the `.groups` argument.

data_critical %>%
group_by(context_condition, DA_presence, region_country) %>%
filter(region_country == "argentina" | region_country == "mexico" | region_country == "spain" | region_country == "usa" | region_country == "venezuela") %>%
summarize(mean_affect = mean(affect_rating), mean_felicity = mean(felicity_rating), trial_sum = n()) %>%
#filter(trial_sum > 25) %>%
ggplot(aes(x = mean_affect, y = mean_felicity, color = DA_presence, shape = context_condition, size = trial_sum)) +
geom_point() +
facet_wrap(~region_country) +
theme_bw()
`summarise()` has grouped output by 'context_condition', 'DA_presence'. You can override using the `.groups` argument.

data_critical %>%
group_by(context_condition, DA_presence, region_country) %>%
ggplot(aes(x = context_condition,y=felicity_rating, fill = DA_presence)) +
geom_boxplot() +
labs (x="Context Condition", y= "Felicity Rating", fill = "DA Presence") +
scale_x_discrete(labels=c("neutralCG" = "CG", "neutralNoCG" = "No CG")) +
scale_fill_discrete(labels=c("DA", "no DA")) +
facet_wrap(~region_country)

data_critical %>%
group_by(context_condition, DA_presence, region_country) %>%
filter(region_country == "argentina" | region_country == "mexico" | region_country == "spain" | region_country == "usa" | region_country == "venezuela") %>%
summarize(mean_felicity = mean(felicity_rating), CI.Low = ci.low(felicity_rating), CI.High = ci.high(felicity_rating)) %>%
mutate(YMin = mean_felicity - CI.Low, YMax = mean_felicity + CI.High) %>%
ggplot(aes(x=context_condition, y=mean_felicity, fill = DA_presence)) +
geom_bar(stat = "identity", position = dodge) +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
#scale_fill_manual(values = cbPalette) +
theme_bw() +
theme(axis.text.x = element_text(vjust = 0.7)) +
facet_wrap(~region_country)
`summarise()` has grouped output by 'context_condition', 'DA_presence'. You can override using the `.groups` argument.

data_critical %>%
filter(region_country == "argentina" | region_country == "mexico" | region_country == "spain" | region_country == "usa" | region_country == "venezuela") %>%
group_by(DA_presence, region_country) %>%
ggplot(aes(x = region_country,y=felicity_rating, fill = DA_presence)) +
geom_boxplot() +
labs (x="Country", y= "Felicity Rating", fill = "DA Presence") +
scale_fill_discrete(labels=c("DA", "no DA")) +
scale_fill_manual(values = wes_palette("FantasticFox1")[2:4])
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale.

ggsave(file = "graphs/country_felicity_boxplot.png",width=7,height=5)
data_critical %>%
filter(region_country == "argentina" | region_country == "mexico" | region_country == "spain" | region_country == "usa" | region_country == "venezuela") %>%
group_by(condition, region_country) %>%
ggplot(aes(x = region_country,y=felicity_rating, fill = condition)) +
geom_boxplot() +
labs (x="Item Type", y= "Felicity Rating", fill = "DA Presence")

#scale_fill_discrete(labels=c("DA", "no DA"))
data_critical %>%
filter(region_country == "argentina" | region_country == "mexico" | region_country == "spain" | region_country == "usa" | region_country == "venezuela") %>%
group_by(DA_presence, region_country) %>%
ggplot(aes(x = region_country,y=affect_rating, fill = DA_presence)) +
geom_boxplot() +
labs (x="Country", y= "Affect Rating", fill = "DA Presence") +
scale_fill_discrete(labels=c("DA", "no DA")) +
scale_fill_manual(values = wes_palette("FantasticFox1")[2:4])
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale.

ggsave(file = "graphs/country_affect_boxplot.png",width=7,height=5)
data_critical %>%
group_by(context_condition, DA_presence, education) %>%
summarize(mean_affect = mean(affect_rating), mean_felicity = mean(felicity_rating), trial_sum = n()) %>%
ggplot(aes(x = mean_affect, y = mean_felicity, color = DA_presence, shape = context_condition, size = trial_sum)) +
geom_point() +
facet_wrap(~education) +
theme_bw()
`summarise()` has grouped output by 'context_condition', 'DA_presence'. You can override using the `.groups` argument.

data_critical %>%
filter(!is.na(age)) %>%
group_by(workerid, age, DA_presence) %>%
summarize(mean_affect = mean(affect_rating), mean_felicity = mean(felicity_rating)) %>%
ggplot(aes(x = age, y = mean_felicity, color = DA_presence)) +
geom_point(size =3) +
geom_smooth(method = "lm") +
theme_bw()
`summarise()` has grouped output by 'workerid', 'age'. You can override using the `.groups` argument.

data_critical %>%
filter(!is.na(age)) %>%
filter(reported_usage == "0" | reported_usage == "1" | reported_usage == "2" | reported_usage == "3" ) %>%
group_by(workerid, age) %>%
summarize(reported_usage = paste(unique(reported_usage))) %>%
ggplot(aes(x = age, y = as.numeric(reported_usage))) +
geom_point(size =3) +
geom_smooth(method = "lm") +
theme_bw()
`summarise()` has grouped output by 'workerid'. You can override using the `.groups` argument.

data_critical %>%
filter(!is.na(age)) %>%
group_by(workerid, age, DA_presence) %>%
summarize(mean_affect = mean(affect_rating), mean_felicity = mean(felicity_rating)) %>%
ggplot(aes(x = age, y = mean_affect, color = DA_presence)) +
geom_point(size =3) +
geom_smooth(method = "lm") +
geom_hline(yintercept = 0.5) +
theme_bw()
`summarise()` has grouped output by 'workerid', 'age'. You can override using the `.groups` argument.

data_critical %>%
group_by(context_condition, DA_presence, reported_usage) %>%
summarize(mean_affect = mean(affect_rating), mean_felicity = mean(felicity_rating), trial_sum = n()) %>%
ggplot(aes(x = mean_affect, y = mean_felicity, color = DA_presence, shape = context_condition, size = trial_sum)) +
geom_point() +
facet_wrap(~reported_usage)
`summarise()` has grouped output by 'context_condition', 'DA_presence'. You can override using the `.groups` argument.



data_critical %>%
filter(reported_usage == "0" | reported_usage == "1" | reported_usage == "2" | reported_usage == "3" ) %>%
group_by(condition, reported_usage) %>%
summarize(mean_felicity = mean(felicity_rating), CI.Low = ci.low(felicity_rating), CI.High = ci.high(felicity_rating)) %>%
mutate(YMin = mean_felicity - CI.Low, YMax = mean_felicity + CI.High) %>%
ggplot(aes(x= reorder(reported_usage, mean_felicity), y=mean_felicity, fill = condition)) +
geom_bar(stat = "identity", position = dodge) +
#geom_jitter(data=data_critical,aes(y=felicity_rating),alpha=.5,color="lightblue") +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
#labs (x="Context Condition", y= "Felicity Rating", fill = "DA Presence") +
#scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_manual(values = cbPalette) +
#scale_fill_manual(values = wes_palette("FantasticFox1")) +
theme_bw() +
theme(axis.text.x = element_text(vjust = 0.7))
`summarise()` has grouped output by 'condition'. You can override using the `.groups` argument.

dodge = position_dodge(.9)
data_critical %>%
filter(reported_usage == "0" | reported_usage == "1" | reported_usage == "2" | reported_usage == "3" ) %>%
group_by(DA_presence, reported_usage, context_condition) %>%
summarize(mean_felicity = mean(felicity_rating), CI.Low = ci.low(felicity_rating), CI.High = ci.high(felicity_rating)) %>%
mutate(YMin = mean_felicity - CI.Low, YMax = mean_felicity + CI.High) %>%
ggplot(aes(x=context_condition, y=mean_felicity, fill = DA_presence)) +
geom_bar(stat = "identity", position = dodge) +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
labs (x="Context Condition", y= "Felicity Rating", fill = "DA Presence") +
scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_manual(values = cbPalette) +
#scale_fill_manual(values = wes_palette("FantasticFox1")[2:4]) +
theme(axis.text.x = element_text(vjust = 0.7)) +
facet_wrap(~ reported_usage)
`summarise()` has grouped output by 'DA_presence', 'reported_usage'. You can override using the `.groups` argument.

dodge = position_dodge(.9)
data_critical %>%
filter(reported_usage == "0" | reported_usage == "1" | reported_usage == "2" | reported_usage == "3" ) %>%
group_by(DA_presence, reported_usage, context_condition) %>%
summarize(mean_affect = mean(affect_rating), CI.Low = ci.low(affect_rating), CI.High = ci.high(affect_rating)) %>%
mutate(YMin = mean_affect - CI.Low, YMax = mean_affect + CI.High) %>%
ggplot(aes(x=context_condition, y=mean_affect, fill = DA_presence)) +
geom_bar(stat = "identity", position = dodge) +
#geom_jitter(data=data_critical,aes(y=felicity_rating),alpha=.5,color="lightblue") +
geom_errorbar(aes(ymin = YMin, ymax = YMax), width = .25, position = dodge) +
labs (x="Context Condition", y= "Affect Rating", fill = "DA Presence") +
scale_x_discrete(labels=c("neutralCG" = "Common Ground", "neutralNoCG" = "No Common Ground")) +
scale_fill_manual(values = cbPalette) +
#scale_fill_manual(values = wes_palette("FantasticFox1")) +
theme(axis.text.x = element_text(vjust = 0.7)) +
facet_wrap(~ reported_usage)
`summarise()` has grouped output by 'DA_presence', 'reported_usage'. You can override using the `.groups` argument.


data_critical %>%
group_by(context_condition, DA_presence, reported_familiarity) %>%
summarize(mean_affect = mean(affect_rating), mean_felicity = mean(felicity_rating), trial_sum = n()) %>%
ggplot(aes(x = mean_affect, y = mean_felicity, color = DA_presence, shape = context_condition, size = trial_sum)) +
geom_point() +
facet_wrap(~reported_familiarity)
`summarise()` has grouped output by 'context_condition', 'DA_presence'. You can override using the `.groups` argument.

data_critical %>%
#filter(reported_familiarity == "0" | reported_familiarity == "1" | reported_familiarity == "2" | reported_familiarity == "3" ) %>%
group_by(DA_presence, reported_familiarity) %>%
ggplot(aes(x = reported_familiarity,y=felicity_rating, fill = DA_presence)) +
geom_boxplot() +
labs (x="Item Type", y= "Felicity Rating", fill = "DA Presence") +
scale_fill_discrete(labels=c("DA", "no DA"))

data_critical %>%
#filter(reported_familiarity == "0" | reported_familiarity == "1" | reported_familiarity == "2" | reported_familiarity == "3") %>%
group_by(DA_presence, reported_familiarity) %>%
ggplot(aes(x = reported_familiarity,y=affect_rating, fill = DA_presence)) +
geom_boxplot() +
labs (x="Item Type", y= "Affect Rating", fill = "DA Presence") +
scale_fill_discrete(labels=c("DA", "no DA"))

Data modeling
Releveling (changing reference level) and centering DA predictor and context condition predictor
data_model = data_critical %>%
mutate(context_condition = fct_relevel(context_condition, "neutralNoCG")) %>%
mutate(numDA_presence = as.numeric(DA_presence), numcontext_condition = as.numeric(context_condition)) %>%
mutate(cDA_presence = scale(numDA_presence), cContext_condition = scale(numcontext_condition))
- (OSF preregistered analysis) Linear mixed effects analysis, predicting felicity from a centered presence of the DA predictor and a centered context condition predictor. By subject and by item, random intercepts as well as random slopes for condition and DA presence.
felicity_mdl <- lmer(felicity_rating ~ cDA_presence*cContext_condition + (1 + cDA_presence + cContext_condition|workerid) + (1 + cDA_presence + cContext_condition|item_type), data=data_model, REML=F)
summary(felicity_mdl)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: felicity_rating ~ cDA_presence * cContext_condition + (1 + cDA_presence +
cContext_condition | workerid) + (1 + cDA_presence + cContext_condition | item_type)
Data: data_model
AIC BIC logLik deviance df.resid
329.1 413.3 -147.5 295.1 1031
Scaled residuals:
Min 1Q Median 3Q Max
-2.9840 -0.5603 0.1028 0.5781 2.9673
Random effects:
Groups Name Variance Std.Dev. Corr
workerid (Intercept) 0.022473 0.14991
cDA_presence 0.011299 0.10630 -0.68
cContext_condition 0.004487 0.06699 -0.27 -0.35
item_type (Intercept) 0.001935 0.04398
cDA_presence 0.000970 0.03115 0.26
cContext_condition 0.001135 0.03369 -0.77 0.25
Residual 0.055257 0.23507
Number of obs: 1048, groups: workerid, 131; item_type, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 0.62679 0.02168 18.34441 28.913 < 2e-16 ***
cDA_presence 0.10514 0.01629 16.18323 6.456 7.5e-06 ***
cContext_condition 0.07247 0.01531 10.20344 4.734 0.000757 ***
cDA_presence:cContext_condition 0.02223 0.00777 858.01487 2.862 0.004317 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) cDA_pr cCntx_
cDA_presenc -0.106
cCntxt_cndt -0.494 0.059
cDA_prsn:C_ -0.002 -0.018 -0.002
Simple regressions to analyze interaction in felicity_mdl
summary(felicity_mdl.simple)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: felicity_rating ~ DA_presence * context_condition - context_condition +
(1 + DA_presence + context_condition | workerid) + (1 + DA_presence +
context_condition | item_type)
Data: data_model
AIC BIC logLik deviance df.resid
329.1 413.3 -147.5 295.1 1031
Scaled residuals:
Min 1Q Median 3Q Max
-2.9840 -0.5603 0.1028 0.5780 2.9672
Random effects:
Groups Name Variance Std.Dev. Corr
workerid (Intercept) 0.051928 0.22788
DA_presencenoDA 0.048676 0.22063 -0.69
context_conditionneutralCG 0.017948 0.13397 -0.36 -0.35
item_type (Intercept) 0.005925 0.07697
DA_presencenoDA 0.004175 0.06462 -0.27
context_conditionneutralCG 0.004544 0.06741 -0.97 0.25
Residual 0.055257 0.23507
Number of obs: 1048, groups: workerid, 131; item_type, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 0.48972 0.03646 17.85773 13.430 9.01e-11 ***
DA_presencenoDA 0.17067 0.03792 25.57704 4.500 0.00013 ***
DA_presenceDA:context_conditionneutralCG 0.11122 0.03284 13.47242 3.386 0.00465 **
DA_presencenoDA:context_conditionneutralCG 0.20352 0.03680 21.11904 5.531 1.70e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) DA_pDA DA_prsncDA:c_CG
DA_prsncnDA -0.459
DA_prsncDA:c_CG -0.759 0.213
DA_prsncnDA:_CG -0.526 -0.208 0.576
optimizer (nloptwrap) convergence code: 0 (OK)
Model failed to converge with max|grad| = 0.00230512 (tol = 0.002, component 1)
summary(felicity_mdl.simple1.2)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: felicity_rating ~ DA_presence * context_condition - context_condition +
(1 + DA_presence + context_condition | workerid) + (1 | item_type)
Data: data_model
AIC BIC logLik deviance df.resid
339.9 399.4 -158.0 315.9 1036
Scaled residuals:
Min 1Q Median 3Q Max
-3.1959 -0.5365 0.1418 0.5975 3.0964
Random effects:
Groups Name Variance Std.Dev. Corr
workerid (Intercept) 0.052982 0.23018
DA_presencenoDA 0.048529 0.22029 -0.69
context_conditionneutralCG 0.016746 0.12941 -0.35 -0.38
item_type (Intercept) 0.002071 0.04551
Residual 0.057499 0.23979
Number of obs: 1048, groups: workerid, 131; item_type, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 0.48721 0.02934 48.65604 16.607 < 2e-16 ***
DA_presencenoDA 0.17455 0.03041 264.31048 5.740 2.59e-08 ***
DA_presenceDA:context_conditionneutralCG 0.11187 0.02267 238.40614 4.935 1.51e-06 ***
DA_presencenoDA:context_conditionneutralCG 0.20006 0.02806 450.44717 7.130 4.02e-12 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) DA_pDA DA_prsncDA:c_CG
DA_prsncnDA -0.526
DA_prsncDA:c_CG -0.424 0.184
DA_prsncnDA:_CG -0.092 -0.511 0.191
felicity_mdl.simple2 <- lmer(felicity_rating ~ context_condition*DA_presence - DA_presence + (1 + DA_presence + context_condition|workerid) + (1 + DA_presence + context_condition|item_type), data=data_model, REML=F)
summary(felicity_mdl.simple2)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: felicity_rating ~ context_condition * DA_presence - DA_presence +
(1 + DA_presence + context_condition | workerid) + (1 + DA_presence + context_condition | item_type)
Data: data_model
AIC BIC logLik deviance df.resid
329.1 413.3 -147.5 295.1 1031
Scaled residuals:
Min 1Q Median 3Q Max
-2.9838 -0.5604 0.1028 0.5781 2.9673
Random effects:
Groups Name Variance Std.Dev. Corr
workerid (Intercept) 0.051932 0.22789
DA_presencenoDA 0.048681 0.22064 -0.69
context_conditionneutralCG 0.017942 0.13395 -0.36 -0.35
item_type (Intercept) 0.005926 0.07698
DA_presencenoDA 0.004182 0.06467 -0.27
context_conditionneutralCG 0.004543 0.06740 -0.97 0.26
Residual 0.055258 0.23507
Number of obs: 1048, groups: workerid, 131; item_type, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 0.48972 0.03647 17.85360 13.429 9.05e-11 ***
context_conditionneutralCG 0.11122 0.03284 13.47111 3.386 0.004651 **
context_conditionneutralNoCG:DA_presencenoDA 0.17067 0.03793 25.51918 4.499 0.000131 ***
context_conditionneutralCG:DA_presencenoDA 0.26297 0.03699 23.06763 7.109 3.01e-07 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) cnt_CG c_NCG:
cntxt_cndCG -0.759
c_NCG:DA_DA -0.459 0.213
cn_CG:DA_DA -0.321 -0.096 0.630
- Linear mixed effects analysis, predicting affect from a centered presence of DA predictor and and a centered context condition predictor. By subject and by item, random intercepts as well as random slopes for condition and DA presence.
affect_mdl <- lmer(affect_rating ~ cDA_presence*cContext_condition + (1 + cDA_presence + cContext_condition|workerid) + (1|item_type), data=data_model, REML=F)
summary(affect_mdl)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: affect_rating ~ cDA_presence * cContext_condition + (1 + cDA_presence +
cContext_condition | workerid) + (1 | item_type)
Data: data_model
AIC BIC logLik deviance df.resid
-616.3 -556.9 320.2 -640.3 1036
Scaled residuals:
Min 1Q Median 3Q Max
-3.9958 -0.5019 0.0226 0.5831 2.9014
Random effects:
Groups Name Variance Std.Dev. Corr
workerid (Intercept) 0.0170904 0.13073
cDA_presence 0.0031298 0.05594 -0.34
cContext_condition 0.0005461 0.02337 0.25 -0.27
item_type (Intercept) 0.0011279 0.03358
Residual 0.0220981 0.14865
Number of obs: 1048, groups: workerid, 131; item_type, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 6.664e-01 1.713e-02 2.370e+01 38.896 < 2e-16 ***
cDA_presence 2.637e-02 6.859e-03 1.306e+02 3.845 0.000187 ***
cContext_condition 1.755e-02 5.255e-03 1.337e+02 3.340 0.001086 **
cDA_presence:cContext_condition 4.261e-03 4.887e-03 8.595e+02 0.872 0.383523
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) cDA_pr cCntx_
cDA_presenc -0.160
cCntxt_cndt 0.065 -0.065
cDA_prsn:C_ 0.002 0.001 0.010
affect_mdl.simple <- lmer(affect_rating ~ DA_presence*context_condition - context_condition + (1 + DA_presence + context_condition|workerid) + (1|item_type), data=data_model, REML=F)
summary(affect_mdl.simple)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: affect_rating ~ DA_presence * context_condition - context_condition +
(1 + DA_presence + context_condition | workerid) + (1 | item_type)
Data: data_model
AIC BIC logLik deviance df.resid
-616.3 -556.9 320.2 -640.3 1036
Scaled residuals:
Min 1Q Median 3Q Max
-3.9958 -0.5019 0.0226 0.5831 2.9014
Random effects:
Groups Name Variance Std.Dev. Corr
workerid (Intercept) 0.021142 0.14540
DA_presencenoDA 0.013485 0.11612 -0.56
context_conditionneutralCG 0.002185 0.04674 0.14 -0.27
item_type (Intercept) 0.001128 0.03359
Residual 0.022098 0.14865
Number of obs: 1048, groups: workerid, 131; item_type, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 0.63168 0.01942 37.13365 32.528 < 2e-16 ***
DA_presencenoDA 0.04562 0.01765 281.54763 2.585 0.01024 *
DA_presenceDA:context_conditionneutralCG 0.02864 0.01280 258.42126 2.237 0.02612 *
DA_presencenoDA:context_conditionneutralCG 0.04633 0.01670 519.65179 2.774 0.00574 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) DA_pDA DA_prsncDA:c_CG
DA_prsncnDA -0.431
DA_prsncDA:c_CG -0.279 0.295
DA_prsncnDA:_CG 0.024 -0.492 0.073
affect_mdl.simple2 <- lmer(affect_rating ~ context_condition*DA_presence - DA_presence + (1 + DA_presence + context_condition|workerid) + (1|item_type), data=data_model, REML=F)
summary(affect_mdl.simple2)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: affect_rating ~ context_condition * DA_presence - DA_presence +
(1 + DA_presence + context_condition | workerid) + (1 | item_type)
Data: data_model
AIC BIC logLik deviance df.resid
-616.3 -556.9 320.2 -640.3 1036
Scaled residuals:
Min 1Q Median 3Q Max
-3.9958 -0.5019 0.0226 0.5831 2.9014
Random effects:
Groups Name Variance Std.Dev. Corr
workerid (Intercept) 0.021142 0.14540
DA_presencenoDA 0.013484 0.11612 -0.56
context_conditionneutralCG 0.002185 0.04674 0.14 -0.27
item_type (Intercept) 0.001128 0.03359
Residual 0.022098 0.14865
Number of obs: 1048, groups: workerid, 131; item_type, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 0.63168 0.01942 37.14235 32.529 < 2e-16 ***
context_conditionneutralCG 0.02864 0.01280 258.43091 2.237 0.026123 *
context_conditionneutralNoCG:DA_presencenoDA 0.04562 0.01765 281.55716 2.585 0.010241 *
context_conditionneutralCG:DA_presencenoDA 0.06331 0.01731 259.06531 3.657 0.000309 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) cnt_CG c_NCG:
cntxt_cndCG -0.279
c_NCG:DA_DA -0.431 0.295
cn_CG:DA_DA -0.210 -0.369 0.327
summary(region_mdl)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: felicity_rating ~ cDA_presence * cContext_condition + region_country +
(1 + cDA_presence + cContext_condition | workerid) + (1 +
cDA_presence + cContext_condition | item_type)
Data: data_region
AIC BIC logLik deviance df.resid
238.3 337.3 -98.1 196.3 803
Scaled residuals:
Min 1Q Median 3Q Max
-3.2679 -0.5425 0.1101 0.5849 3.0926
Random effects:
Groups Name Variance Std.Dev. Corr
workerid (Intercept) 0.0223542 0.14951
cDA_presence 0.0093433 0.09666 -0.71
cContext_condition 0.0046385 0.06811 -0.35 -0.36
item_type (Intercept) 0.0029706 0.05450
cDA_presence 0.0007791 0.02791 0.33
cContext_condition 0.0007621 0.02761 -0.97 -0.10
Residual 0.0534671 0.23123
Number of obs: 824, groups: workerid, 103; item_type, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 0.678572 0.040601 67.069214 16.713 < 2e-16 ***
cDA_presence 0.114982 0.016062 16.895281 7.159 1.66e-06 ***
cContext_condition 0.080439 0.014557 12.906910 5.526 0.0001 ***
region_countrymexico -0.038139 0.050308 102.491854 -0.758 0.4501
region_countryspain -0.070743 0.046598 98.609101 -1.518 0.1322
region_countryusa -0.079151 0.041890 96.141961 -1.890 0.0618 .
region_countryvenezuela -0.070523 0.052186 103.760639 -1.351 0.1795
cDA_presence:cContext_condition 0.018369 0.008563 675.287983 2.145 0.0323 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) cDA_pr cCntx_ rgn_cntrym rgn_cntrysp regn_cntrys rgn_cntryv
cDA_presenc -0.058
cCntxt_cndt -0.379 -0.140
rgn_cntrymx -0.585 0.001 0.019
rgn_cntrysp -0.629 0.003 0.012 0.507
regn_cntrys -0.697 -0.002 0.005 0.564 0.606
rgn_cntryvn -0.561 0.007 0.006 0.451 0.486 0.541
cDA_prsn:C_ -0.020 -0.026 -0.010 0.034 0.029 0.010 -0.005
LS0tCnRpdGxlOiAic3BhbmlzaF9kZWZpbml0ZV9hcnRpY2xlcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBsaWJyYXJpZXMKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRicGx5cikKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShsYW5ndWFnZVIpCmxpYnJhcnkobG1lNCkKbGlicmFyeSh3ZXNhbmRlcnNvbikKY2JQYWxldHRlIDwtIGMoIiNFNjlGMDAiLCAiIzU2QjRFOSIsICIjMDA5RTczIiwgIiNGMEU0NDIiLCAiIzAwNzJCMiIsICJENTVFMDAiLCAiI0NDNzlBNyIpCnNvdXJjZSgiaGVscGVycy5yIikKYGBgCgojIGRhdGEgZmlsdGVyaW5nCgpgYGB7cn0KZGF0YSA9IHJlYWQuY3N2KCJtYWluLXRyaWFscy5jc3YiKQpkZW1vID0gcmVhZC5jc3YoIm1haW4tc3ViamVjdF9pbmZvcm1hdGlvbi5jc3YiKQpgYGAKCmBgYHtyfQpkYXRhIDwtIGRhdGEgJT4lCiAgbGVmdF9qb2luKGRlbW8sIGJ5PSJ3b3JrZXJpZCIpCmBgYAoKCmBgYHtyfQpkYXRhID0gZGF0YSAlPiUKICBmaWx0ZXIoYXR0ZW50aW9uX3Jlc3BvbnNlICE9ICJOQSIgJiBpdGVtX3R5cGUgIT0gImV4YW1wbGUzIikgJT4lCiAgbXV0YXRlKGF0dGVudGlvbl9wYXNzID0gaWZlbHNlKGF0dGVudGlvbl9yZXNwb25zZSA9PSBhdHRlbnRpb25fY29ycmVjdF9yZXNwb25zZSwgMSwgMCkpICU+JQogIGFycmFuZ2Uod29ya2VyaWQpCmBgYAoKYGBge3J9CmF0dGVudGlvbl9leGNsdXNpb24gPSBkYXRhICU+JQogIGdyb3VwX2J5KHdvcmtlcmlkKSAlPiUKICBzdW1tYXJpemUoYWNjdXJhY3kgPSBtZWFuKGF0dGVudGlvbl9wYXNzKSkgJT4lCiAgbXV0YXRlKGV4Y2x1ZGUgPSBpZmVsc2UoYWNjdXJhY3kgPCAwLjgsICJ5ZXMiLCAibm8iKSkgJT4lCiAgZmlsdGVyKGV4Y2x1ZGUgPT0gInllcyIpCmBgYAoKYGBge3J9CmF0dGVudGlvbl9jb3JyZWN0ID0gZGF0YSAlPiUKICBncm91cF9ieSh3b3JrZXJpZCkgJT4lCiAgc3VtbWFyaXplKGFjY3VyYWN5ID0gbWVhbihhdHRlbnRpb25fcGFzcykpICU+JQogIG11dGF0ZShleGNsdWRlID0gaWZlbHNlKGFjY3VyYWN5IDwgMC44LCAieWVzIiwgIm5vIikpICU+JQogIGZpbHRlcihleGNsdWRlID09ICJubyIpCmBgYAoKYGBge3J9Cm5vbm5hdGl2ZSA9IGRlbW8gJT4lCiAgZmlsdGVyKG5hdGl2ZSAhPSAieWVzIikKYGBgCgpleHBlcmltZW50IGNvbXBsZXRpb24gdGltZXMgYmVmb3JlIGV4Y2x1c2lvbnMKYGBge3J9CmRhdGEgJT4lCiAgZ3JvdXBfYnkod29ya2VyaWQpICU+JQogIHN1bW1hcml6ZSh0aW1lID0gbWVhbihBbnN3ZXIudGltZV9pbl9taW51dGVzKSkgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oKSAgKwogIHhsYWIoIkF2ZXJhZ2UgY29tcGxldGlvbiB0aW1lIikgKwogIHlsYWIoIk51bWJlciBvZiBjYXNlcyIpICsKICB0aGVtZV9idygpCmBgYAoKRXhjbHVkaW5nIGZyb20gZGF0YSBmcmFtZXMKYGBge3J9CmRhdGEgPSBkYXRhWyEoZGF0YSR3b3JrZXJpZCAlaW4lIGF0dGVudGlvbl9leGNsdXNpb24kd29ya2VyaWQpLF0KZGF0YSA9IGRhdGFbIShkYXRhJHdvcmtlcmlkICVpbiUgbm9ubmF0aXZlJHdvcmtlcmlkKSxdCgpkZW1vID0gZGVtb1shKGRlbW8kd29ya2VyaWQgJWluJSBhdHRlbnRpb25fZXhjbHVzaW9uJHdvcmtlcmlkKSxdCmRlbW8gPSBkZW1vWyEoZGVtbyR3b3JrZXJpZCAlaW4lIG5vbm5hdGl2ZSR3b3JrZXJpZCksXQoKYGBgCgoKVGltZSBleGNsdXNpb25zIGFmdGVyIGZpbHRlcmluZyBkYXRhIGJhc2VkIG9uIGF0dGVudGlvbiBjaGVja3MgYW5kIG5hdGl2ZSBsYW5ndWFnZQpgYGB7cn0KdGltZV9leGNsdXNpb25zID0gZGF0YSAlPiUKICBncm91cF9ieSh3b3JrZXJpZCkgJT4lCiAgc3VtbWFyaXplKHRpbWUgPSBtZWFuKEFuc3dlci50aW1lX2luX21pbnV0ZXMpKSAlPiUKICBmaWx0ZXIodGltZSA8IDEwKQoKbGVuZ3RoKHVuaXF1ZSh0aW1lX2V4Y2x1c2lvbnMkd29ya2VyaWQpKQpgYGAKCmV4cGVyaW1lbnQgY29tcGxldGlvbiB0aW1lcyBiZWZvcmUgdGltZSBleGNsdXNpb25zCmBgYHtyfQpkYXRhICU+JQogIGdyb3VwX2J5KHdvcmtlcmlkKSAlPiUKICBzdW1tYXJpemUodGltZSA9IG1lYW4oQW5zd2VyLnRpbWVfaW5fbWludXRlcykpICU+JQogIGdncGxvdChhZXMoeD10aW1lKSkgKwogIGdlb21faGlzdG9ncmFtKCkgICsKICB4bGFiKCJBdmVyYWdlIGNvbXBsZXRpb24gdGltZSIpICsKICB5bGFiKCJOdW1iZXIgb2YgY2FzZXMiKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpkYXRhID0gZGF0YVshKGRhdGEkd29ya2VyaWQgJWluJSB0aW1lX2V4Y2x1c2lvbnMkd29ya2VyaWQpLF0KZGVtbyA9IGRlbW9bIShkZW1vJHdvcmtlcmlkICVpbiUgdGltZV9leGNsdXNpb25zJHdvcmtlcmlkKSxdCmBgYAoKCmRvdWJsZSBjaGVjayBkZW1vIGFuZCBkYXRhIGFyZSB0aGUgc2FtZQpgYGB7cn0KbGVuZ3RoKGRlbW8kd29ya2VyaWQpCmxlbmd0aCh1bmlxdWUoZGF0YSR3b3JrZXJpZCkpCmBgYAoKYGBge3J9CndyaXRlLmNzdihkZW1vLCAiZGVtby5jc3YiKQpgYGAKCgpjaGFuZ2UgY2hhcmFjdGVyIHZhcmlhYmxlIHRvIGZhY3RvciB2YXJpYWJsZXMKYGBge3J9CmRhdGEgPSBkYXRhICU+JQogIG11dGF0ZShhZ2UgPSBhcy5udW1lcmljKGFnZSkpICU+JSAKICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLGFzLmZhY3RvcikKCmRlbW8gPSBkZW1vICU+JQogIG11dGF0ZShhZ2UgPSBhcy5udW1lcmljKGFnZSkpCgpkZW1vID0gZGVtbyAlPiUKICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLGFzLmZhY3RvcikKCmBgYAoKCiMgTWFpbiBkYXRhIHZpc3VhbGl6YXRpb25zCgpTZXQgdGhlIGJhY2tncm91bmQgdG8gYmUgd2hpdGUgaW5zdGVhZCBvZiBncmF5LgpgYGB7cn0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpCmBgYAoKZXhwZXJpbWVudCBjb21wbGV0aW9uIHRpbWVzCmBgYHtyfQpkYXRhICU+JQogIGdyb3VwX2J5KHdvcmtlcmlkKSAlPiUKICBzdW1tYXJpemUodGltZSA9IG1lYW4oQW5zd2VyLnRpbWVfaW5fbWludXRlcykpICU+JQogIGdncGxvdChhZXMoeD10aW1lKSkgKwogIGdlb21faGlzdG9ncmFtKCkgICsKICB4bGFiKCJBdmVyYWdlIGNvbXBsZXRpb24gdGltZSIpICsKICB5bGFiKCJOdW1iZXIgb2YgY2FzZXMiKSArCiAgdGhlbWVfYncoKQpgYGAKCkZpbHRlcmluZyBkYXRhIGJ5IGNyaXRpY2FsIGFuZCBmaWxsZXIgdHJpYWxzLgpkcm9wbGV2ZWxzKCkgZ2V0cyByaWQgb2YgdW51c2VkIGZhY3RvciBsZXZlbHMgKGkuZS4gImZpbGxlciIgaW4gZGF0YV9jcml0aWNhbCkKYGBge3J9CmRhdGFfY3JpdGljYWwgPSBkYXRhICU+JQogIGZpbHRlcih0cmlhbF90eXBlID09ICJjcml0aWNhbCIpICU+JSAKICBkcm9wbGV2ZWxzKCkgCgpkYXRhX2ZpbGxlciA9IGRhdGEgJT4lIAogIGZpbHRlcih0cmlhbF90eXBlID09ICJmaWxsZXIiKQpgYGAKCgpgYGB7ciBmZWxpY2l0eSBiYXJwbG90fQpkb2RnZSA9IHBvc2l0aW9uX2RvZGdlKC45KQoKZGF0YV9jcml0aWNhbCAlPiUgCiAgZ3JvdXBfYnkoY29udGV4dF9jb25kaXRpb24sIERBX3ByZXNlbmNlKSAlPiUKICBzdW1tYXJpemUobWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSwgQ0kuTG93ID0gY2kubG93KGZlbGljaXR5X3JhdGluZyksIENJLkhpZ2ggPSBjaS5oaWdoKGZlbGljaXR5X3JhdGluZykpICU+JQogIG11dGF0ZShZTWluID0gbWVhbl9mZWxpY2l0eSAtIENJLkxvdywgWU1heCA9IG1lYW5fZmVsaWNpdHkgKyBDSS5IaWdoKSAlPiUgCiAgZ2dwbG90KGFlcyh4PXJlb3JkZXIoY29udGV4dF9jb25kaXRpb24sIG1lYW5fZmVsaWNpdHkpLCB5PW1lYW5fZmVsaWNpdHksIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gZG9kZ2UpICsKICAjZ2VvbV9qaXR0ZXIoZGF0YT1kYXRhX2NyaXRpY2FsLGFlcyh5PWZlbGljaXR5X3JhdGluZyksYWxwaGE9LjUsY29sb3I9ImxpZ2h0Ymx1ZSIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gWU1pbiwgeW1heCA9IFlNYXgpLCB3aWR0aCA9IC4yNSwgcG9zaXRpb24gPSBkb2RnZSkgKwogIGxhYnMgKHg9IkNvbnRleHQgQ29uZGl0aW9uIiwgeT0gIk1lYW4gRmVsaWNpdHkgUmF0aW5nIiwgZmlsbCA9ICJEQSBQcmVzZW5jZSIpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJuZXV0cmFsQ0ciID0gIkNvbW1vbiBHcm91bmQiLCAibmV1dHJhbE5vQ0ciID0gIk5vIENvbW1vbiBHcm91bmQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKGxhYmVscz1jKCJEQSIsICJubyBEQSIpLCB2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRmFudGFzdGljRm94MSIpWzI6NF0pICsKICAjZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG1lYW5fZmVsaWNpdHkpLCBzaXplID0gMykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC43KSkKYGBgCgoKYGBge3J9Cmdnc2F2ZShmaWxlID0gImdyYXBocy9mZWxpY2l0eV9iYXJwbG90LnBuZyIsd2lkdGg9NSxoZWlnaHQ9NCkKYGBgCgpgYGB7cn0KZG9kZ2UgPSBwb3NpdGlvbl9kb2RnZSguOSkKCmRhdGFfY3JpdGljYWwgJT4lIAogIGdyb3VwX2J5KERBX3ByZXNlbmNlLCBjb250ZXh0X2NvbmRpdGlvbikgJT4lCiAgc3VtbWFyaXplKG1lYW5fZmVsaWNpdHkgPSBtZWFuKGZlbGljaXR5X3JhdGluZyksIENJLkxvdyA9IGNpLmxvdyhmZWxpY2l0eV9yYXRpbmcpLCBDSS5IaWdoID0gY2kuaGlnaChmZWxpY2l0eV9yYXRpbmcpKSAlPiUKICBtdXRhdGUoWU1pbiA9IG1lYW5fZmVsaWNpdHkgLSBDSS5Mb3csIFlNYXggPSBtZWFuX2ZlbGljaXR5ICsgQ0kuSGlnaCkgJT4lIAogIGdncGxvdChhZXMoeD1EQV9wcmVzZW5jZSwgeT1tZWFuX2ZlbGljaXR5LCBmaWxsID0gY29udGV4dF9jb25kaXRpb24pKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IGRvZGdlKSArCiAgI2dlb21faml0dGVyKGRhdGE9ZGF0YV9jcml0aWNhbCxhZXMoeT1mZWxpY2l0eV9yYXRpbmcpLGFscGhhPS41LGNvbG9yPSJsaWdodGJsdWUiKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IFlNaW4sIHltYXggPSBZTWF4KSwgd2lkdGggPSAuMjUsIHBvc2l0aW9uID0gZG9kZ2UpICsKICBsYWJzICh4PSJDb250ZXh0IENvbmRpdGlvbiIsIHk9ICJNZWFuIEZlbGljaXR5IFJhdGluZyIsIGZpbGwgPSAiREEgUHJlc2VuY2UiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygibmV1dHJhbENHIiA9ICJDb21tb24gR3JvdW5kIiwgIm5ldXRyYWxOb0NHIiA9ICJObyBDb21tb24gR3JvdW5kIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRmFudGFzdGljRm94MSIpWzI6NF0pICsKICNnZW9tX3RleHQoYWVzKGxhYmVsID0gbWVhbl9mZWxpY2l0eSksIHNpemUgPSAzKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcpKQpgYGAKCgpgYGB7cn0KZG9kZ2UgPSBwb3NpdGlvbl9kb2RnZSguOSkKCmRhdGFfY3JpdGljYWwgJT4lIAogIGdyb3VwX2J5KERBX3ByZXNlbmNlKSAlPiUKICBzdW1tYXJpemUobWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSwgQ0kuTG93ID0gY2kubG93KGZlbGljaXR5X3JhdGluZyksIENJLkhpZ2ggPSBjaS5oaWdoKGZlbGljaXR5X3JhdGluZykpICU+JQogIG11dGF0ZShZTWluID0gbWVhbl9mZWxpY2l0eSAtIENJLkxvdywgWU1heCA9IG1lYW5fZmVsaWNpdHkgKyBDSS5IaWdoKSAlPiUgCiAgZ2dwbG90KGFlcyh4PURBX3ByZXNlbmNlLCB5PW1lYW5fZmVsaWNpdHkpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IGRvZGdlKSArCiAgI2dlb21faml0dGVyKGRhdGE9ZGF0YV9jcml0aWNhbCxhZXMoeT1mZWxpY2l0eV9yYXRpbmcpLGFscGhhPS41LGNvbG9yPSJsaWdodGJsdWUiKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IFlNaW4sIHltYXggPSBZTWF4KSwgd2lkdGggPSAuMjUsIHBvc2l0aW9uID0gZG9kZ2UpICsKICAjbGFicyAoeD0iQ29udGV4dCBDb25kaXRpb24iLCB5PSAiTWVhbiBGZWxpY2l0eSBSYXRpbmciLCBmaWxsID0gIkRBIFByZXNlbmNlIikgKwogICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJuZXV0cmFsQ0ciID0gIkNvbW1vbiBHcm91bmQiLCAibmV1dHJhbE5vQ0ciID0gIk5vIENvbW1vbiBHcm91bmQiKSkgKwogICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIkZhbnRhc3RpY0ZveDEiKVsyOjRdKSArCiBnZW9tX3RleHQoYWVzKGxhYmVsID0gbWVhbl9mZWxpY2l0eSksIHNpemUgPSAzKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcpKQpgYGAKCgpgYGB7ciBmZWxpY2l0eSBib3ggcGxvdH0KICBkYXRhX2NyaXRpY2FsICU+JSAKICBncm91cF9ieShjb250ZXh0X2NvbmRpdGlvbiwgREFfcHJlc2VuY2UpICU+JQogIGdncGxvdChhZXMoeCA9IGNvbnRleHRfY29uZGl0aW9uLHk9ZmVsaWNpdHlfcmF0aW5nLCBmaWxsID0gREFfcHJlc2VuY2UpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGxhYnMgKHg9IkNvbnRleHQgQ29uZGl0aW9uIiwgeT0gIkZlbGljaXR5IFJhdGluZyIsIGZpbGwgPSAiREEgUHJlc2VuY2UiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygibmV1dHJhbENHIiA9ICJDb21tb24gR3JvdW5kIiwgIm5ldXRyYWxOb0NHIiA9ICJObyBDb21tb24gR3JvdW5kIikpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGxhYmVscz1jKCJEQSIsICJubyBEQSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIkZhbnRhc3RpY0ZveDEiKVsyOjRdKQpgYGAKCgpgYGB7ciBhZmZlY3QgYmFyIHBsb3R9CmRvZGdlID0gcG9zaXRpb25fZG9kZ2UoLjkpCgpkYXRhX2NyaXRpY2FsICU+JSAKICBncm91cF9ieShjb250ZXh0X2NvbmRpdGlvbiwgREFfcHJlc2VuY2UpICU+JQogIHN1bW1hcml6ZShtZWFuX2FmZmVjdCA9IG1lYW4oYWZmZWN0X3JhdGluZyksIENJLkxvdyA9IGNpLmxvdyhhZmZlY3RfcmF0aW5nKSwgQ0kuSGlnaCA9IGNpLmhpZ2goYWZmZWN0X3JhdGluZykpICU+JQogIG11dGF0ZShZTWluID0gbWVhbl9hZmZlY3QgLSBDSS5Mb3csIFlNYXggPSBtZWFuX2FmZmVjdCArIENJLkhpZ2gpICU+JSAKICBnZ3Bsb3QoYWVzKHg9cmVvcmRlcihjb250ZXh0X2NvbmRpdGlvbiwgbWVhbl9hZmZlY3QpLCB5PW1lYW5fYWZmZWN0LCBmaWxsID0gREFfcHJlc2VuY2UpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IGRvZGdlKSArCiAgI2dlb21faml0dGVyKGRhdGE9ZGF0YV9jcml0aWNhbCxhZXMoeT1hZmZlY3RfcmF0aW5nKSxhbHBoYT0uNSxjb2xvcj0ibGlnaHRibHVlIikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBZTWluLCB5bWF4ID0gWU1heCksIHdpZHRoID0gLjI1LCBwb3NpdGlvbiA9IGRvZGdlKSArCiAgbGFicyAoeD0iQ29udGV4dCBDb25kaXRpb24iLCB5PSAiTWVhbiBBZmZlY3QgUmF0aW5nIiwgZmlsbCA9ICJEQSBQcmVzZW5jZSIpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJuZXV0cmFsQ0ciID0gIkNvbW1vbiBHcm91bmQiLCAibmV1dHJhbE5vQ0ciID0gIk5vIENvbW1vbiBHcm91bmQiKSkgKwogICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICBzY2FsZV9maWxsX21hbnVhbChsYWJlbHM9YygiREEiLCAibm8gREEiKSwgdmFsdWVzID0gd2VzX3BhbGV0dGUoIkZhbnRhc3RpY0ZveDEiKVsyOjRdKSArCiAjZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG1lYW5fYWZmZWN0KSwgc2l6ZSA9IDMpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNykpCgpgYGAKCmBgYHtyfQpnZ3NhdmUoZmlsZSA9ICJncmFwaHMvYWZmZWN0X2JhcnBsb3QucG5nIix3aWR0aD01LGhlaWdodD00KQpgYGAKCmBgYHtyICBhZmZlY3QgYm94IHBsb3R9CiAgZGF0YV9jcml0aWNhbCAlPiUgCiAgZ3JvdXBfYnkoY29udGV4dF9jb25kaXRpb24sIERBX3ByZXNlbmNlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb250ZXh0X2NvbmRpdGlvbix5PWFmZmVjdF9yYXRpbmcsIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgbGFicyAoeD0iQ29udGV4dCBDb25kaXRpb24iLCB5PSAiQWZmZWN0IFJhdGluZyIsIGZpbGwgPSAiREEgUHJlc2VuY2UiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygibmV1dHJhbENHIiA9ICJDb21tb24gR3JvdW5kIiwgIm5ldXRyYWxOb0NHIiA9ICJObyBDb21tb24gR3JvdW5kIikpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGxhYmVscz1jKCJEQSIsICJubyBEQSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIkZhbnRhc3RpY0ZveDEiKVsyOjRdKQpgYGAKCgpgYGB7cn0KZG9kZ2UgPSBwb3NpdGlvbl9kb2RnZSguOSkKCmRhdGFfY3JpdGljYWwgJT4lIAogIGdyb3VwX2J5KERBX3ByZXNlbmNlKSAlPiUKICBzdW1tYXJpemUobWVhbl9hZmZlY3QgPSBtZWFuKGFmZmVjdF9yYXRpbmcpLCBDSS5Mb3cgPSBjaS5sb3coYWZmZWN0X3JhdGluZyksIENJLkhpZ2ggPSBjaS5oaWdoKGFmZmVjdF9yYXRpbmcpKSAlPiUKICBtdXRhdGUoWU1pbiA9IG1lYW5fYWZmZWN0IC0gQ0kuTG93LCBZTWF4ID0gbWVhbl9hZmZlY3QgKyBDSS5IaWdoKSAlPiUgCiAgZ2dwbG90KGFlcyh4PURBX3ByZXNlbmNlLCB5PW1lYW5fYWZmZWN0KSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBkb2RnZSkgKwogICNnZW9tX2ppdHRlcihkYXRhPWRhdGFfY3JpdGljYWwsYWVzKHk9ZmVsaWNpdHlfcmF0aW5nKSxhbHBoYT0uNSxjb2xvcj0ibGlnaHRibHVlIikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBZTWluLCB5bWF4ID0gWU1heCksIHdpZHRoID0gLjI1LCBwb3NpdGlvbiA9IGRvZGdlKSArCiAgI2xhYnMgKHg9IkNvbnRleHQgQ29uZGl0aW9uIiwgeT0gIk1lYW4gRmVsaWNpdHkgUmF0aW5nIiwgZmlsbCA9ICJEQSBQcmVzZW5jZSIpICsKICAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygibmV1dHJhbENHIiA9ICJDb21tb24gR3JvdW5kIiwgIm5ldXRyYWxOb0NHIiA9ICJObyBDb21tb24gR3JvdW5kIikpICsKICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArCiAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJGYW50YXN0aWNGb3gxIilbMjo0XSkgKwogZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG1lYW5fYWZmZWN0KSwgc2l6ZSA9IDMpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNykpCmBgYAoKCmBgYHtyfQpkb2RnZSA9IHBvc2l0aW9uX2RvZGdlKC45KQoKZGF0YSAlPiUgCiAgZ3JvdXBfYnkoY29udGV4dF9jb25kaXRpb24sIERBX3ByZXNlbmNlKSAlPiUKICBzdW1tYXJpemUobWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSwgQ0kuTG93ID0gY2kubG93KGZlbGljaXR5X3JhdGluZyksIENJLkhpZ2ggPSBjaS5oaWdoKGZlbGljaXR5X3JhdGluZykpICU+JQogIG11dGF0ZShZTWluID0gbWVhbl9mZWxpY2l0eSAtIENJLkxvdywgWU1heCA9IG1lYW5fZmVsaWNpdHkgKyBDSS5IaWdoKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWNvbnRleHRfY29uZGl0aW9uLCB5PW1lYW5fZmVsaWNpdHksIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gZG9kZ2UpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gWU1pbiwgeW1heCA9IFlNYXgpLCB3aWR0aCA9IC4yNSwgcG9zaXRpb24gPSBkb2RnZSkgKwogICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNykpCmBgYAoKYGBge3J9CmRvZGdlID0gcG9zaXRpb25fZG9kZ2UoLjkpCgpkYXRhICU+JSAKICBncm91cF9ieShjb250ZXh0X2NvbmRpdGlvbiwgREFfcHJlc2VuY2UpICU+JQogIHN1bW1hcml6ZShtZWFuX2FmZmVjdCA9IG1lYW4oYWZmZWN0X3JhdGluZyksIENJLkxvdyA9IGNpLmxvdyhhZmZlY3RfcmF0aW5nKSwgQ0kuSGlnaCA9IGNpLmhpZ2goYWZmZWN0X3JhdGluZykpICU+JQogIG11dGF0ZShZTWluID0gbWVhbl9hZmZlY3QgLSBDSS5Mb3csIFlNYXggPSBtZWFuX2FmZmVjdCArIENJLkhpZ2gpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Y29udGV4dF9jb25kaXRpb24sIHk9bWVhbl9hZmZlY3QsIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gZG9kZ2UpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gWU1pbiwgeW1heCA9IFlNYXgpLCB3aWR0aCA9IC4yNSwgcG9zaXRpb24gPSBkb2RnZSkgKwogICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNykpCmBgYAoKCmBgYHtyfQpkYXRhICU+JSAKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcml6ZShtZWFuX2FmZmVjdCA9IG1lYW4oYWZmZWN0X3JhdGluZykpICU+JQogIGdncGxvdChhZXMoeD1yZW9yZGVyKGNvbmRpdGlvbixtZWFuX2FmZmVjdCksIHk9bWVhbl9hZmZlY3QpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjcpKQpgYGAKCmBgYHtyfQpkYXRhX2NyaXRpY2FsICU+JQogIGdncGxvdChhZXMoeCA9IGFmZmVjdF9yYXRpbmcsIHkgPSBmZWxpY2l0eV9yYXRpbmcsIGNvbG9yID0gY29uZGl0aW9uKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmRhdGEgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpemUobWVhbl9hZmZlY3QgPSBtZWFuKGFmZmVjdF9yYXRpbmcpLCBtZWFuX2ZlbGljaXR5ID0gbWVhbihmZWxpY2l0eV9yYXRpbmcpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBtZWFuX2FmZmVjdCwgeSA9IG1lYW5fZmVsaWNpdHksIGNvbG9yID0gY29uZGl0aW9uKSkgKwogIGdlb21fcG9pbnQoKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpkYXRhX2NyaXRpY2FsICU+JQogIGdyb3VwX2J5KGNvbnRleHRfY29uZGl0aW9uLCBEQV9wcmVzZW5jZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fYWZmZWN0ID0gbWVhbihhZmZlY3RfcmF0aW5nKSwgbWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbWVhbl9hZmZlY3QsIHkgPSBtZWFuX2ZlbGljaXR5LCBjb2xvciA9IERBX3ByZXNlbmNlLCBzaGFwZSA9IGNvbnRleHRfY29uZGl0aW9uKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9MykgKwogIHRoZW1lX2J3KCkKYGBgCgoKCmBgYHtyfQpkYXRhX2NyaXRpY2FsICU+JQogIGdyb3VwX2J5KGNvbnRleHRfY29uZGl0aW9uLCBEQV9wcmVzZW5jZSwgaXRlbV90eXBlKSAlPiUKICBzdW1tYXJpemUobWVhbl9hZmZlY3QgPSBtZWFuKGFmZmVjdF9yYXRpbmcpLCBtZWFuX2ZlbGljaXR5ID0gbWVhbihmZWxpY2l0eV9yYXRpbmcpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBtZWFuX2FmZmVjdCwgeSA9IG1lYW5fZmVsaWNpdHksIGNvbG9yID0gREFfcHJlc2VuY2UsIHNoYXBlID0gY29udGV4dF9jb25kaXRpb24sIGdyb3VwID0gREFfcHJlc2VuY2UpKSArCiAgZ2VvbV9wb2ludChzaXplID0zKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKyAKICB0aGVtZV9idygpCmBgYAojIyBWYXJpYXRpb24gYnkgaXRlbSB0eXBlcwpgYGB7cn0KZGF0YV9jcml0aWNhbCAlPiUKICBncm91cF9ieShjb250ZXh0X2NvbmRpdGlvbiwgREFfcHJlc2VuY2UsIGl0ZW1fdHlwZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fYWZmZWN0ID0gbWVhbihhZmZlY3RfcmF0aW5nKSwgbWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbWVhbl9hZmZlY3QsIHkgPSBtZWFuX2ZlbGljaXR5LCBjb2xvciA9IERBX3ByZXNlbmNlLCBzaGFwZSA9IGNvbnRleHRfY29uZGl0aW9uLCBncm91cCA9IERBX3ByZXNlbmNlLCBsYWJlbCA9IGl0ZW1fdHlwZSkpICsKICBnZW9tX3BvaW50KHNpemUgPTMpICsKICBnZW9tX3RleHQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKYGBgCgpgYGB7cn0KICBkYXRhX2NyaXRpY2FsICU+JSAKICBncm91cF9ieShjb250ZXh0X2NvbmRpdGlvbiwgREFfcHJlc2VuY2UsIGl0ZW1fdHlwZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY29udGV4dF9jb25kaXRpb24seT1mZWxpY2l0eV9yYXRpbmcsIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgbGFicyAoeD0iQ29udGV4dCBDb25kaXRpb24iLCB5PSAiRmVsaWNpdHkgUmF0aW5nIiwgZmlsbCA9ICJEQSBQcmVzZW5jZSIpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJuZXV0cmFsQ0ciID0gIkNvbW1vbiBHcm91bmQiLCAibmV1dHJhbE5vQ0ciID0gIk5vIENvbW1vbiBHcm91bmQiKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobGFiZWxzPWMoIkRBIiwgIm5vIERBIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRmFudGFzdGljRm94MSIpWzI6NF0pICsKICBmYWNldF93cmFwKH5pdGVtX3R5cGUpCmBgYAoKCmBgYHtyfQogIGRhdGFfY3JpdGljYWwgJT4lIAogIGdyb3VwX2J5KGNvbnRleHRfY29uZGl0aW9uLCBEQV9wcmVzZW5jZSwgaXRlbV90eXBlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb250ZXh0X2NvbmRpdGlvbix5PWFmZmVjdF9yYXRpbmcsIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgbGFicyAoeD0iQ29udGV4dCBDb25kaXRpb24iLCB5PSAiQWZmZWN0IFJhdGluZyIsIGZpbGwgPSAiREEgUHJlc2VuY2UiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygibmV1dHJhbENHIiA9ICJDb21tb24gR3JvdW5kIiwgIm5ldXRyYWxOb0NHIiA9ICJObyBDb21tb24gR3JvdW5kIikpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGxhYmVscz1jKCJEQSIsICJubyBEQSIpKSArCiAgZmFjZXRfd3JhcCh+aXRlbV90eXBlKQpgYGAKCmBgYHtyfQogIGRhdGFfY3JpdGljYWwgJT4lIAogIGdyb3VwX2J5KERBX3ByZXNlbmNlLCBpdGVtX3R5cGUpICU+JQogIGdncGxvdChhZXMoeCA9IGl0ZW1fdHlwZSx5PWZlbGljaXR5X3JhdGluZywgZmlsbCA9IERBX3ByZXNlbmNlKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBsYWJzICh4PSJJdGVtIFR5cGUiLCB5PSAiRmVsaWNpdHkgUmF0aW5nIiwgZmlsbCA9ICJEQSBQcmVzZW5jZSIpICsKICAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygibmV1dHJhbENHIiA9ICJDb21tb24gR3JvdW5kIiwgIm5ldXRyYWxOb0NHIiA9ICJObyBDb21tb24gR3JvdW5kIikpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGxhYmVscz1jKCJEQSIsICJubyBEQSIpKQpgYGAKCmBgYHtyfQogIGRhdGFfY3JpdGljYWwgJT4lIAogIGdyb3VwX2J5KERBX3ByZXNlbmNlLCBpdGVtX3R5cGUpICU+JQogIGdncGxvdChhZXMoeCA9IGl0ZW1fdHlwZSx5PWFmZmVjdF9yYXRpbmcsIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgbGFicyAoeD0iSXRlbSBUeXBlIiwgeT0gIkFmZmVjdCBSYXRpbmciLCBmaWxsID0gIkRBIFByZXNlbmNlIikgKwogICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJuZXV0cmFsQ0ciID0gIkNvbW1vbiBHcm91bmQiLCAibmV1dHJhbE5vQ0ciID0gIk5vIENvbW1vbiBHcm91bmQiKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobGFiZWxzPWMoIkRBIiwgIm5vIERBIikpCmBgYAoKUGxvdCB0aGUgZmVsY2l0eSBhbmQgYWZmZWN0IHJhdGluZ3MgZm9yIGVhY2ggaXRlbV90eXBlIGJ5IHVzaW5nIGZhY2V0cy4KCmBgYHtyfQpnZ3Bsb3QoZGF0YSwgYWVzKHg9YWZmZWN0X3JhdGluZyx5PWZlbGljaXR5X3JhdGluZywgY29sb3I9Y29uZGl0aW9uKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsgCiAgZmFjZXRfd3JhcCh+aXRlbV90eXBlKQpgYGAKClBsb3QgdGhlIGZlbGNpdHkgYW5kIGFmZmVjdCByYXRpbmdzIGZvciBlYWNoIGl0ZW1fdHlwZSBieSB1c2luZyBmYWNldHMuCgpgYGB7cn0KZ2dwbG90KGRhdGFfY3JpdGljYWwsIGFlcyh4PWFmZmVjdF9yYXRpbmcseT1mZWxpY2l0eV9yYXRpbmcsIGNvbG9yPWNvbmRpdGlvbikpICsKICBnZW9tX3BvaW50KCkgKwogICNnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICBnZW9tX3Ntb290aCgpICsgCiAgZmFjZXRfd3JhcCh+aXRlbV90eXBlKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YV9jcml0aWNhbCwgYWVzKHg9YWZmZWN0X3JhdGluZyx5PWZlbGljaXR5X3JhdGluZywgY29sb3I9Y29udGV4dF9jb25kaXRpb24pKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICBmYWNldF93cmFwKH5pdGVtX3R5cGUpCmBgYAoKYGBge3J9CmdncGxvdChkYXRhX2ZpbGxlciwgYWVzKHg9YWZmZWN0X3JhdGluZyx5PWZlbGljaXR5X3JhdGluZywgY29sb3I9Y29udGV4dF9jb25kaXRpb24pKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICBmYWNldF93cmFwKH5pdGVtX3R5cGUpCmBgYAoKYGBge3IgUG9zaXRpdmUgYW5kIE5lZ2F0aXZlIEZpbGxlciBwbG90c30KZGF0YV9maWxsZXIgJT4lIAogIGZpbHRlcihpdGVtX3R5cGUgPT0gImNlbGxwaG9uZSIgfCBpdGVtX3R5cGUgPT0gInN3aW1taW5nIikgJT4lICAKICBnZ3Bsb3QoYWVzKHg9YWZmZWN0X3JhdGluZyx5PWZlbGljaXR5X3JhdGluZywgY29sb3I9Y29udGV4dF9jb25kaXRpb24pKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICBsYWJzICh4PSJBZmZlY3QgUmF0aW5nIiwgeT0gIkZlbGljaXR5IFJhdGluZyIsIGNvbG9yID0gIkNvbnRleHQgQ29uZGl0aW9uIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHM9YygiTmVnYXRpdmUgRmlsbGVyIiwgIlBvc2l0aXZlIEZpbGxlciIpLCB2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzEiKSkgKwogIGZhY2V0X3dyYXAofml0ZW1fdHlwZSkKYGBgCgpgYGB7cn0KZ2dzYXZlKGZpbGUgPSAiZ3JhcGhzL2FmZmVjdF9maWxsZXJzX3NjYXR0ZXJwbG90LnBuZyIsd2lkdGg9OCxoZWlnaHQ9NCkKYGBgCgpgYGB7ciBEQSBwcmVzZW5jZSBieSBpdGVtIHR5cGV9CmdncGxvdChkYXRhX2NyaXRpY2FsLCBhZXMoeD1hZmZlY3RfcmF0aW5nLHk9ZmVsaWNpdHlfcmF0aW5nLCBjb2xvcj1EQV9wcmVzZW5jZSkpICsKICBnZW9tX3BvaW50KCkgKwogICNnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICBnZW9tX3Ntb290aCgpICsgCiAgbGFicyAoeD0iQWZmZWN0IFJhdGluZyIsIHk9ICJGZWxpY2l0eSBSYXRpbmciLCBjb2xvciA9ICJEQSBQcmVzZW5jZSIpICsKICAjc2NhbGVfY29sb3JfZGlzY3JldGUobGFiZWxzPWMoIkRBIiwgIm5vIERBIiksIHZhbHVlcyA9IHdlc19wYWxldHRlKCJGYW50YXN0aWNGb3gxIilbMjo0XSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHM9YygiREEiLCAibm8gREEiKSwgdmFsdWVzID0gY2JQYWxldHRlKSArCiAgZmFjZXRfd3JhcCh+aXRlbV90eXBlKQpgYGAKIApgYGB7cn0KZ2dzYXZlKGZpbGUgPSAiZ3JhcGhzL0RBX2J5X2l0ZW1fdHlwZS5wbmciLHdpZHRoPTEwLGhlaWdodD03KQpgYGAKIApgYGB7ciByZWZlcmVudCBnZW5kZXJ9CmdncGxvdChkYXRhX2NyaXRpY2FsLCBhZXMoeD1hZmZlY3RfcmF0aW5nLHk9ZmVsaWNpdHlfcmF0aW5nLCBjb2xvcj1EQV9wcmVzZW5jZSkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSArIAogICNnZW9tX3Ntb290aCgpICsgCiAgbGFicyAoeD0iQWZmZWN0IFJhdGluZyIsIHk9ICJGZWxpY2l0eSBSYXRpbmciLCBjb2xvciA9ICJEQSBQcmVzZW5jZSIpICsKICAjc2NhbGVfY29sb3JfZGlzY3JldGUobGFiZWxzPWMoIkRBIiwgIm5vIERBIiksIHZhbHVlcyA9IHdlc19wYWxldHRlKCJGYW50YXN0aWNGb3gxIilbMjo0XSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICBmYWNldF93cmFwKH5yZWZlcmVudF9nZW5kZXIpCmBgYAogCmBgYHtyfQpnZ3Bsb3QoZGF0YV9jcml0aWNhbCwgYWVzKHg9YWZmZWN0X3JhdGluZyx5PWZlbGljaXR5X3JhdGluZywgY29sb3I9REFfcHJlc2VuY2UpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKyAKICAjZ2VvbV9zbW9vdGgoKSArIAogIGxhYnMgKHg9IkFmZmVjdCBSYXRpbmciLCB5PSAiRmVsaWNpdHkgUmF0aW5nIiwgY29sb3IgPSAiREEgUHJlc2VuY2UiKSArCiAgI3NjYWxlX2NvbG9yX2Rpc2NyZXRlKGxhYmVscz1jKCJEQSIsICJubyBEQSIpLCB2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRmFudGFzdGljRm94MSIpWzI6NF0pICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhpdGVtX3R5cGUpLCBjb2xzID0gdmFycyhyZWZlcmVudF9nZW5kZXIpKQpgYGAgCgpgYGB7cn0KZG9kZ2UgPSBwb3NpdGlvbl9kb2RnZSguOSkKCmRhdGFfY3JpdGljYWwgJT4lIAogIGdyb3VwX2J5KHJlZmVyZW50X2dlbmRlciwgREFfcHJlc2VuY2UsIGl0ZW1fdHlwZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fZmVsaWNpdHkgPSBtZWFuKGZlbGljaXR5X3JhdGluZyksIENJLkxvdyA9IGNpLmxvdyhmZWxpY2l0eV9yYXRpbmcpLCBDSS5IaWdoID0gY2kuaGlnaChmZWxpY2l0eV9yYXRpbmcpKSAlPiUKICBtdXRhdGUoWU1pbiA9IG1lYW5fZmVsaWNpdHkgLSBDSS5Mb3csIFlNYXggPSBtZWFuX2ZlbGljaXR5ICsgQ0kuSGlnaCkgJT4lIAogIGdncGxvdChhZXMoeD1yZWZlcmVudF9nZW5kZXIsIHk9bWVhbl9mZWxpY2l0eSwgZmlsbCA9IERBX3ByZXNlbmNlKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBkb2RnZSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBZTWluLCB5bWF4ID0gWU1heCksIHdpZHRoID0gLjI1LCBwb3NpdGlvbiA9IGRvZGdlKSArCiAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC43KSkgKwogIGZhY2V0X3dyYXAofml0ZW1fdHlwZSkKYGBgCgoKYGBge3J9CiAgZGF0YV9jcml0aWNhbCAlPiUgCiAgZ3JvdXBfYnkoREFfcHJlc2VuY2UsIHJlZmVyZW50X2dlbmRlcikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVmZXJlbnRfZ2VuZGVyLHk9ZmVsaWNpdHlfcmF0aW5nLCBmaWxsID0gREFfcHJlc2VuY2UpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogICNsYWJzICh4PSJDb250ZXh0IENvbmRpdGlvbiIsIHk9ICJGZWxpY2l0eSBSYXRpbmciLCBmaWxsID0gIkRBIFByZXNlbmNlIikgKwogICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJuZXV0cmFsQ0ciID0gIkNvbW1vbiBHcm91bmQiLCAibmV1dHJhbE5vQ0ciID0gIk5vIENvbW1vbiBHcm91bmQiKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobGFiZWxzPWMoIkRBIiwgIm5vIERBIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRmFudGFzdGljRm94MSIpWzI6NF0pCmBgYAoKYGBge3J9CiAgZGF0YV9jcml0aWNhbCAlPiUgCiAgZ3JvdXBfYnkoREFfcHJlc2VuY2UsIHJlZmVyZW50X2dlbmRlcikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVmZXJlbnRfZ2VuZGVyLHk9YWZmZWN0X3JhdGluZywgZmlsbCA9IERBX3ByZXNlbmNlKSkgKwogIGdlb21fYm94cGxvdCgpICsKICAjbGFicyAoeD0iQ29udGV4dCBDb25kaXRpb24iLCB5PSAiRmVsaWNpdHkgUmF0aW5nIiwgZmlsbCA9ICJEQSBQcmVzZW5jZSIpICsKICAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygibmV1dHJhbENHIiA9ICJDb21tb24gR3JvdW5kIiwgIm5ldXRyYWxOb0NHIiA9ICJObyBDb21tb24gR3JvdW5kIikpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGxhYmVscz1jKCJEQSIsICJubyBEQSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIkZhbnRhc3RpY0ZveDEiKVsyOjRdKQpgYGAKIApgYGB7cn0KZG9kZ2UgPSBwb3NpdGlvbl9kb2RnZSguOSkKCmRhdGFfY3JpdGljYWwgJT4lIAogIGdyb3VwX2J5KGNvbnRleHRfY29uZGl0aW9uLCBEQV9wcmVzZW5jZSwgaXRlbV90eXBlKSAlPiUKICBzdW1tYXJpemUobWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSwgQ0kuTG93ID0gY2kubG93KGZlbGljaXR5X3JhdGluZyksIENJLkhpZ2ggPSBjaS5oaWdoKGZlbGljaXR5X3JhdGluZykpICU+JQogIG11dGF0ZShZTWluID0gbWVhbl9mZWxpY2l0eSAtIENJLkxvdywgWU1heCA9IG1lYW5fZmVsaWNpdHkgKyBDSS5IaWdoKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWNvbnRleHRfY29uZGl0aW9uLCB5PW1lYW5fZmVsaWNpdHksIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gZG9kZ2UpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gWU1pbiwgeW1heCA9IFlNYXgpLCB3aWR0aCA9IC4yNSwgcG9zaXRpb24gPSBkb2RnZSkgKwogICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNykpICsKICBmYWNldF93cmFwKH5pdGVtX3R5cGUpCmBgYAoKYGBge3J9CmRvZGdlID0gcG9zaXRpb25fZG9kZ2UoLjkpCgpkYXRhX2NyaXRpY2FsICU+JSAKICBncm91cF9ieShjb250ZXh0X2NvbmRpdGlvbiwgREFfcHJlc2VuY2UsIGl0ZW1fdHlwZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fYWZmZWN0ID0gbWVhbihhZmZlY3RfcmF0aW5nKSwgQ0kuTG93ID0gY2kubG93KGFmZmVjdF9yYXRpbmcpLCBDSS5IaWdoID0gY2kuaGlnaChhZmZlY3RfcmF0aW5nKSkgJT4lCiAgbXV0YXRlKFlNaW4gPSBtZWFuX2FmZmVjdCAtIENJLkxvdywgWU1heCA9IG1lYW5fYWZmZWN0ICsgQ0kuSGlnaCkgJT4lIAogIGdncGxvdChhZXMoeD1jb250ZXh0X2NvbmRpdGlvbiwgeT1tZWFuX2FmZmVjdCwgZmlsbCA9IERBX3ByZXNlbmNlKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBkb2RnZSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBZTWluLCB5bWF4ID0gWU1heCksIHdpZHRoID0gLjI1LCBwb3NpdGlvbiA9IGRvZGdlKSArCiAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC43KSkgKwogIGZhY2V0X3dyYXAofml0ZW1fdHlwZSkKYGBgCgoKIyBFeHBsb3JhdG9yeSBkYXRhIHZpc3VhbGl6YXRpb25zIGZvciBzb2NpYWwgdmFyaWFibGVzCgpgYGB7cn0KZGF0YSAlPiUKICBncm91cF9ieShyZWdpb25fY291bnRyeSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZmN0X2luZnJlcShyZWdpb25fY291bnRyeSksIGZpbGw9cmVnaW9uX2NvdW50cnkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdjb3VudCcpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNykpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiWmlzc291MSIsIDE1LCB0eXBlID0gImNvbnRpbnVvdXMiKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7ciBQYXJ0aWNpcGFudHMgYnkgY291bnRyeX0KZGVtbyAlPiUKICBncm91cF9ieShyZWdpb25fY291bnRyeSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZmN0X2luZnJlcShyZWdpb25fY291bnRyeSksIGZpbGw9cmVnaW9uX2NvdW50cnkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdjb3VudCcpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDAuNykpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiWmlzc291MSIsIDE1LCB0eXBlID0gImNvbnRpbnVvdXMiKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnMgKHg9IkNvdW50cnkiLCB5PSAiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9Cmdnc2F2ZShmaWxlID0gImdyYXBocy9wYXJ0aWNpcGFudHNfY291bnRyeS5wbmciLHdpZHRoPTUsaGVpZ2h0PTQpCmBgYAoKCmBgYHtyfQpkb2RnZSA9IHBvc2l0aW9uX2RvZGdlKC45KQoKZGF0YV9jcml0aWNhbCAlPiUgCiAgZ3JvdXBfYnkoY29udGV4dF9jb25kaXRpb24sIERBX3ByZXNlbmNlLCByZWdpb25fY291bnRyeSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fZmVsaWNpdHkgPSBtZWFuKGZlbGljaXR5X3JhdGluZyksIENJLkxvdyA9IGNpLmxvdyhmZWxpY2l0eV9yYXRpbmcpLCBDSS5IaWdoID0gY2kuaGlnaChmZWxpY2l0eV9yYXRpbmcpKSAlPiUKICBtdXRhdGUoWU1pbiA9IG1lYW5fZmVsaWNpdHkgLSBDSS5Mb3csIFlNYXggPSBtZWFuX2ZlbGljaXR5ICsgQ0kuSGlnaCkgJT4lIAogIGdncGxvdChhZXMoeD1jb250ZXh0X2NvbmRpdGlvbiwgeT1tZWFuX2ZlbGljaXR5LCBmaWxsID0gREFfcHJlc2VuY2UpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IGRvZGdlKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IFlNaW4sIHltYXggPSBZTWF4KSwgd2lkdGggPSAuMjUsIHBvc2l0aW9uID0gZG9kZ2UpICsKICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcpKSArCiAgZmFjZXRfd3JhcCh+cmVnaW9uX2NvdW50cnkpCmBgYAoKYGBge3J9CmRhdGFfY3JpdGljYWwgJT4lCiAgZ3JvdXBfYnkoY29udGV4dF9jb25kaXRpb24sIERBX3ByZXNlbmNlLCByZWdpb25fY291bnRyeSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fYWZmZWN0ID0gbWVhbihhZmZlY3RfcmF0aW5nKSwgbWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSwgdHJpYWxfc3VtID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBtZWFuX2FmZmVjdCwgeSA9IG1lYW5fZmVsaWNpdHksIGNvbG9yID0gREFfcHJlc2VuY2UsIHNoYXBlID0gY29udGV4dF9jb25kaXRpb24sIHNpemUgPSB0cmlhbF9zdW0pKSArCiAgZ2VvbV9wb2ludCgpICsKICBmYWNldF93cmFwKH5yZWdpb25fY291bnRyeSkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZGF0YV9jcml0aWNhbCAlPiUKICBncm91cF9ieShjb250ZXh0X2NvbmRpdGlvbiwgREFfcHJlc2VuY2UsIHJlZ2lvbl9jb3VudHJ5KSAlPiUKICBmaWx0ZXIocmVnaW9uX2NvdW50cnkgPT0gImFyZ2VudGluYSIgfCByZWdpb25fY291bnRyeSA9PSAibWV4aWNvIiB8IHJlZ2lvbl9jb3VudHJ5ID09ICJzcGFpbiIgfCByZWdpb25fY291bnRyeSA9PSAidXNhIiB8IHJlZ2lvbl9jb3VudHJ5ID09ICJ2ZW5lenVlbGEiKSAlPiUgCiAgc3VtbWFyaXplKG1lYW5fYWZmZWN0ID0gbWVhbihhZmZlY3RfcmF0aW5nKSwgbWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSwgdHJpYWxfc3VtID0gbigpKSAlPiUKICAjZmlsdGVyKHRyaWFsX3N1bSA+IDI1KSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gbWVhbl9hZmZlY3QsIHkgPSBtZWFuX2ZlbGljaXR5LCBjb2xvciA9IERBX3ByZXNlbmNlLCBzaGFwZSA9IGNvbnRleHRfY29uZGl0aW9uLCBzaXplID0gdHJpYWxfc3VtKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZmFjZXRfd3JhcCh+cmVnaW9uX2NvdW50cnkpICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CiAgZGF0YV9jcml0aWNhbCAlPiUgCiAgZ3JvdXBfYnkoY29udGV4dF9jb25kaXRpb24sIERBX3ByZXNlbmNlLCByZWdpb25fY291bnRyeSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY29udGV4dF9jb25kaXRpb24seT1mZWxpY2l0eV9yYXRpbmcsIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgbGFicyAoeD0iQ29udGV4dCBDb25kaXRpb24iLCB5PSAiRmVsaWNpdHkgUmF0aW5nIiwgZmlsbCA9ICJEQSBQcmVzZW5jZSIpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJuZXV0cmFsQ0ciID0gIkNHIiwgIm5ldXRyYWxOb0NHIiA9ICJObyBDRyIpKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShsYWJlbHM9YygiREEiLCAibm8gREEiKSkgKwogIGZhY2V0X3dyYXAofnJlZ2lvbl9jb3VudHJ5KQpgYGAKCmBgYHtyfQpkb2RnZSA9IHBvc2l0aW9uX2RvZGdlKC45KQoKZGF0YV9jcml0aWNhbCAlPiUgCiAgZ3JvdXBfYnkoY29udGV4dF9jb25kaXRpb24sIERBX3ByZXNlbmNlLCByZWdpb25fY291bnRyeSkgJT4lCiAgZmlsdGVyKHJlZ2lvbl9jb3VudHJ5ID09ICJhcmdlbnRpbmEiIHwgcmVnaW9uX2NvdW50cnkgPT0gIm1leGljbyIgfCByZWdpb25fY291bnRyeSA9PSAic3BhaW4iIHwgcmVnaW9uX2NvdW50cnkgPT0gInVzYSIgfCByZWdpb25fY291bnRyeSA9PSAidmVuZXp1ZWxhIikgJT4lCiAgc3VtbWFyaXplKG1lYW5fZmVsaWNpdHkgPSBtZWFuKGZlbGljaXR5X3JhdGluZyksIENJLkxvdyA9IGNpLmxvdyhmZWxpY2l0eV9yYXRpbmcpLCBDSS5IaWdoID0gY2kuaGlnaChmZWxpY2l0eV9yYXRpbmcpKSAlPiUKICBtdXRhdGUoWU1pbiA9IG1lYW5fZmVsaWNpdHkgLSBDSS5Mb3csIFlNYXggPSBtZWFuX2ZlbGljaXR5ICsgQ0kuSGlnaCkgJT4lIAogIGdncGxvdChhZXMoeD1jb250ZXh0X2NvbmRpdGlvbiwgeT1tZWFuX2ZlbGljaXR5LCBmaWxsID0gREFfcHJlc2VuY2UpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IGRvZGdlKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IFlNaW4sIHltYXggPSBZTWF4KSwgd2lkdGggPSAuMjUsIHBvc2l0aW9uID0gZG9kZ2UpICsKICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcpKSArCiAgZmFjZXRfd3JhcCh+cmVnaW9uX2NvdW50cnkpCmBgYAoKCgpgYGB7ciBGZWxpY2l0eSBieSB0b3AgNSBjb3VudHJpZXN9CiAgZGF0YV9jcml0aWNhbCAlPiUgCiAgZmlsdGVyKHJlZ2lvbl9jb3VudHJ5ID09ICJhcmdlbnRpbmEiIHwgcmVnaW9uX2NvdW50cnkgPT0gIm1leGljbyIgfCByZWdpb25fY291bnRyeSA9PSAic3BhaW4iIHwgcmVnaW9uX2NvdW50cnkgPT0gInVzYSIgfCByZWdpb25fY291bnRyeSA9PSAidmVuZXp1ZWxhIikgJT4lCiAgZ3JvdXBfYnkoREFfcHJlc2VuY2UsIHJlZ2lvbl9jb3VudHJ5KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZWdpb25fY291bnRyeSx5PWZlbGljaXR5X3JhdGluZywgZmlsbCA9IERBX3ByZXNlbmNlKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBsYWJzICh4PSJDb3VudHJ5IiwgeT0gIkZlbGljaXR5IFJhdGluZyIsIGZpbGwgPSAiREEgUHJlc2VuY2UiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShsYWJlbHM9YygiREEiLCAibm8gREEiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJGYW50YXN0aWNGb3gxIilbMjo0XSkKYGBgCgpgYGB7cn0KZ2dzYXZlKGZpbGUgPSAiZ3JhcGhzL2NvdW50cnlfZmVsaWNpdHlfYm94cGxvdC5wbmciLHdpZHRoPTcsaGVpZ2h0PTUpCmBgYAoKYGBge3J9CiAgZGF0YV9jcml0aWNhbCAlPiUgCiAgZmlsdGVyKHJlZ2lvbl9jb3VudHJ5ID09ICJhcmdlbnRpbmEiIHwgcmVnaW9uX2NvdW50cnkgPT0gIm1leGljbyIgfCByZWdpb25fY291bnRyeSA9PSAic3BhaW4iIHwgcmVnaW9uX2NvdW50cnkgPT0gInVzYSIgfCByZWdpb25fY291bnRyeSA9PSAidmVuZXp1ZWxhIikgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uLCByZWdpb25fY291bnRyeSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVnaW9uX2NvdW50cnkseT1mZWxpY2l0eV9yYXRpbmcsIGZpbGwgPSBjb25kaXRpb24pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGxhYnMgKHg9Ikl0ZW0gVHlwZSIsIHk9ICJGZWxpY2l0eSBSYXRpbmciLCBmaWxsID0gIkRBIFByZXNlbmNlIikKICAjc2NhbGVfZmlsbF9kaXNjcmV0ZShsYWJlbHM9YygiREEiLCAibm8gREEiKSkKYGBgCgpgYGB7cn0KICBkYXRhX2NyaXRpY2FsICU+JSAKICBmaWx0ZXIocmVnaW9uX2NvdW50cnkgPT0gImFyZ2VudGluYSIgfCByZWdpb25fY291bnRyeSA9PSAibWV4aWNvIiB8IHJlZ2lvbl9jb3VudHJ5ID09ICJzcGFpbiIgfCByZWdpb25fY291bnRyeSA9PSAidXNhIiB8IHJlZ2lvbl9jb3VudHJ5ID09ICJ2ZW5lenVlbGEiKSAlPiUKICBncm91cF9ieShEQV9wcmVzZW5jZSwgcmVnaW9uX2NvdW50cnkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlZ2lvbl9jb3VudHJ5LHk9YWZmZWN0X3JhdGluZywgZmlsbCA9IERBX3ByZXNlbmNlKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBsYWJzICh4PSJDb3VudHJ5IiwgeT0gIkFmZmVjdCBSYXRpbmciLCBmaWxsID0gIkRBIFByZXNlbmNlIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobGFiZWxzPWMoIkRBIiwgIm5vIERBIikpICsKIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJGYW50YXN0aWNGb3gxIilbMjo0XSkKYGBgCgoKYGBge3J9Cmdnc2F2ZShmaWxlID0gImdyYXBocy9jb3VudHJ5X2FmZmVjdF9ib3hwbG90LnBuZyIsd2lkdGg9NyxoZWlnaHQ9NSkKYGBgCgpgYGB7ciBlZHVjYXRpb259CmRhdGFfY3JpdGljYWwgJT4lCiAgZ3JvdXBfYnkoY29udGV4dF9jb25kaXRpb24sIERBX3ByZXNlbmNlLCBlZHVjYXRpb24pICU+JQogIHN1bW1hcml6ZShtZWFuX2FmZmVjdCA9IG1lYW4oYWZmZWN0X3JhdGluZyksIG1lYW5fZmVsaWNpdHkgPSBtZWFuKGZlbGljaXR5X3JhdGluZyksIHRyaWFsX3N1bSA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbWVhbl9hZmZlY3QsIHkgPSBtZWFuX2ZlbGljaXR5LCBjb2xvciA9IERBX3ByZXNlbmNlLCBzaGFwZSA9IGNvbnRleHRfY29uZGl0aW9uLCBzaXplID0gdHJpYWxfc3VtKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZmFjZXRfd3JhcCh+ZWR1Y2F0aW9uKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyIGFnZX0KZGF0YV9jcml0aWNhbCAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZSkpICU+JSAKICBncm91cF9ieSh3b3JrZXJpZCwgYWdlLCBEQV9wcmVzZW5jZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fYWZmZWN0ID0gbWVhbihhZmZlY3RfcmF0aW5nKSwgbWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gbWVhbl9mZWxpY2l0eSwgY29sb3IgPSBEQV9wcmVzZW5jZSkpICsKICBnZW9tX3BvaW50KHNpemUgPTMpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpkYXRhX2NyaXRpY2FsICU+JQogIGZpbHRlcighaXMubmEoYWdlKSkgJT4lIAogIGZpbHRlcihyZXBvcnRlZF91c2FnZSA9PSAiMCIgfCByZXBvcnRlZF91c2FnZSA9PSAiMSIgfCByZXBvcnRlZF91c2FnZSA9PSAiMiIgfCByZXBvcnRlZF91c2FnZSA9PSAiMyIgKSAlPiUKICBncm91cF9ieSh3b3JrZXJpZCwgYWdlKSAlPiUKICBzdW1tYXJpemUocmVwb3J0ZWRfdXNhZ2UgPSBwYXN0ZSh1bmlxdWUocmVwb3J0ZWRfdXNhZ2UpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gYXMubnVtZXJpYyhyZXBvcnRlZF91c2FnZSkpKSArCiAgZ2VvbV9wb2ludChzaXplID0zKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZGF0YV9jcml0aWNhbCAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZSkpICU+JSAKICBncm91cF9ieSh3b3JrZXJpZCwgYWdlLCBEQV9wcmVzZW5jZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fYWZmZWN0ID0gbWVhbihhZmZlY3RfcmF0aW5nKSwgbWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gbWVhbl9hZmZlY3QsIGNvbG9yID0gREFfcHJlc2VuY2UpKSArCiAgZ2VvbV9wb2ludChzaXplID0zKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSkgKwogIHRoZW1lX2J3KCkKYGBgCgoKYGBge3IgcmVwb3J0ZWRfdXNhZ2V9CmRhdGFfY3JpdGljYWwgJT4lCiAgZ3JvdXBfYnkoY29udGV4dF9jb25kaXRpb24sIERBX3ByZXNlbmNlLCByZXBvcnRlZF91c2FnZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fYWZmZWN0ID0gbWVhbihhZmZlY3RfcmF0aW5nKSwgbWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSwgdHJpYWxfc3VtID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBtZWFuX2FmZmVjdCwgeSA9IG1lYW5fZmVsaWNpdHksIGNvbG9yID0gREFfcHJlc2VuY2UsIHNoYXBlID0gY29udGV4dF9jb25kaXRpb24sIHNpemUgPSB0cmlhbF9zdW0pKSArCiAgZ2VvbV9wb2ludCgpICsKICBmYWNldF93cmFwKH5yZXBvcnRlZF91c2FnZSkKYGBgCgpgYGB7cn0KICBkYXRhX2NyaXRpY2FsICU+JSAKICBmaWx0ZXIocmVwb3J0ZWRfdXNhZ2UgPT0gIjAiIHwgcmVwb3J0ZWRfdXNhZ2UgPT0gIjEiIHwgcmVwb3J0ZWRfdXNhZ2UgPT0gIjIiIHwgcmVwb3J0ZWRfdXNhZ2UgPT0gIjMiICkgJT4lCiAgZ3JvdXBfYnkoREFfcHJlc2VuY2UsIHJlcG9ydGVkX3VzYWdlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZXBvcnRlZF91c2FnZSx5PWZlbGljaXR5X3JhdGluZywgZmlsbCA9IERBX3ByZXNlbmNlKSkgKwogIGdlb21fYm94cGxvdCgpICsKICAjbGFicyAoeD0iSXRlbSBUeXBlIiwgeT0gIkZlbGljaXR5IFJhdGluZyIsIGZpbGwgPSAiREEgUHJlc2VuY2UiKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShsYWJlbHM9YygiREEiLCAibm8gREEiKSkKYGBgCgoKYGBge3J9CiAgZGF0YV9jcml0aWNhbCAlPiUgCiAgZmlsdGVyKHJlcG9ydGVkX3VzYWdlID09ICIwIiB8IHJlcG9ydGVkX3VzYWdlID09ICIxIiB8IHJlcG9ydGVkX3VzYWdlID09ICIyIiB8IHJlcG9ydGVkX3VzYWdlID09ICIzIikgJT4lCiAgZ3JvdXBfYnkoREFfcHJlc2VuY2UsIHJlcG9ydGVkX3VzYWdlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZXBvcnRlZF91c2FnZSx5PWFmZmVjdF9yYXRpbmcsIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgI2xhYnMgKHg9Ikl0ZW0gVHlwZSIsIHk9ICJBZmZlY3QgUmF0aW5nIiwgZmlsbCA9ICJEQSBQcmVzZW5jZSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGxhYmVscz1jKCJEQSIsICJubyBEQSIpKQpgYGAKCmBgYHtyfQpkb2RnZSA9IHBvc2l0aW9uX2RvZGdlKC45KQoKZGF0YV9jcml0aWNhbCAlPiUgCiAgZmlsdGVyKHJlcG9ydGVkX3VzYWdlID09ICIwIiB8IHJlcG9ydGVkX3VzYWdlID09ICIxIiB8IHJlcG9ydGVkX3VzYWdlID09ICIyIiB8IHJlcG9ydGVkX3VzYWdlID09ICIzIiApICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbiwgcmVwb3J0ZWRfdXNhZ2UpICU+JQogIHN1bW1hcml6ZShtZWFuX2ZlbGljaXR5ID0gbWVhbihmZWxpY2l0eV9yYXRpbmcpLCBDSS5Mb3cgPSBjaS5sb3coZmVsaWNpdHlfcmF0aW5nKSwgQ0kuSGlnaCA9IGNpLmhpZ2goZmVsaWNpdHlfcmF0aW5nKSkgJT4lCiAgbXV0YXRlKFlNaW4gPSBtZWFuX2ZlbGljaXR5IC0gQ0kuTG93LCBZTWF4ID0gbWVhbl9mZWxpY2l0eSArIENJLkhpZ2gpICU+JSAKICBnZ3Bsb3QoYWVzKHg9IHJlb3JkZXIocmVwb3J0ZWRfdXNhZ2UsIG1lYW5fZmVsaWNpdHkpLCB5PW1lYW5fZmVsaWNpdHksIGZpbGwgPSBjb25kaXRpb24pKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IGRvZGdlKSArCiAgI2dlb21faml0dGVyKGRhdGE9ZGF0YV9jcml0aWNhbCxhZXMoeT1mZWxpY2l0eV9yYXRpbmcpLGFscGhhPS41LGNvbG9yPSJsaWdodGJsdWUiKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IFlNaW4sIHltYXggPSBZTWF4KSwgd2lkdGggPSAuMjUsIHBvc2l0aW9uID0gZG9kZ2UpICsKICAjbGFicyAoeD0iQ29udGV4dCBDb25kaXRpb24iLCB5PSAiRmVsaWNpdHkgUmF0aW5nIiwgZmlsbCA9ICJEQSBQcmVzZW5jZSIpICsKICAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygibmV1dHJhbENHIiA9ICJDb21tb24gR3JvdW5kIiwgIm5ldXRyYWxOb0NHIiA9ICJObyBDb21tb24gR3JvdW5kIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIkZhbnRhc3RpY0ZveDEiKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMC43KSkKYGBgCgpgYGB7cn0KZG9kZ2UgPSBwb3NpdGlvbl9kb2RnZSguOSkKCmRhdGFfY3JpdGljYWwgJT4lIAogIGZpbHRlcihyZXBvcnRlZF91c2FnZSA9PSAiMCIgfCByZXBvcnRlZF91c2FnZSA9PSAiMSIgfCByZXBvcnRlZF91c2FnZSA9PSAiMiIgfCByZXBvcnRlZF91c2FnZSA9PSAiMyIgKSAlPiUKICBncm91cF9ieShEQV9wcmVzZW5jZSwgcmVwb3J0ZWRfdXNhZ2UsIGNvbnRleHRfY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpemUobWVhbl9mZWxpY2l0eSA9IG1lYW4oZmVsaWNpdHlfcmF0aW5nKSwgQ0kuTG93ID0gY2kubG93KGZlbGljaXR5X3JhdGluZyksIENJLkhpZ2ggPSBjaS5oaWdoKGZlbGljaXR5X3JhdGluZykpICU+JQogIG11dGF0ZShZTWluID0gbWVhbl9mZWxpY2l0eSAtIENJLkxvdywgWU1heCA9IG1lYW5fZmVsaWNpdHkgKyBDSS5IaWdoKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWNvbnRleHRfY29uZGl0aW9uLCB5PW1lYW5fZmVsaWNpdHksIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gZG9kZ2UpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gWU1pbiwgeW1heCA9IFlNYXgpLCB3aWR0aCA9IC4yNSwgcG9zaXRpb24gPSBkb2RnZSkgKwogIGxhYnMgKHg9IkNvbnRleHQgQ29uZGl0aW9uIiwgeT0gIkZlbGljaXR5IFJhdGluZyIsIGZpbGwgPSAiREEgUHJlc2VuY2UiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygibmV1dHJhbENHIiA9ICJDb21tb24gR3JvdW5kIiwgIm5ldXRyYWxOb0NHIiA9ICJObyBDb21tb24gR3JvdW5kIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIkZhbnRhc3RpY0ZveDEiKVsyOjRdKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjcpKSArCiAgZmFjZXRfd3JhcCh+IHJlcG9ydGVkX3VzYWdlKQpgYGAKCmBgYHtyfQpkb2RnZSA9IHBvc2l0aW9uX2RvZGdlKC45KQoKZGF0YV9jcml0aWNhbCAlPiUgCiAgZmlsdGVyKHJlcG9ydGVkX3VzYWdlID09ICIwIiB8IHJlcG9ydGVkX3VzYWdlID09ICIxIiB8IHJlcG9ydGVkX3VzYWdlID09ICIyIiB8IHJlcG9ydGVkX3VzYWdlID09ICIzIiApICU+JQogIGdyb3VwX2J5KERBX3ByZXNlbmNlLCByZXBvcnRlZF91c2FnZSwgY29udGV4dF9jb25kaXRpb24pICU+JQogIHN1bW1hcml6ZShtZWFuX2FmZmVjdCA9IG1lYW4oYWZmZWN0X3JhdGluZyksIENJLkxvdyA9IGNpLmxvdyhhZmZlY3RfcmF0aW5nKSwgQ0kuSGlnaCA9IGNpLmhpZ2goYWZmZWN0X3JhdGluZykpICU+JQogIG11dGF0ZShZTWluID0gbWVhbl9hZmZlY3QgLSBDSS5Mb3csIFlNYXggPSBtZWFuX2FmZmVjdCArIENJLkhpZ2gpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Y29udGV4dF9jb25kaXRpb24sIHk9bWVhbl9hZmZlY3QsIGZpbGwgPSBEQV9wcmVzZW5jZSkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gZG9kZ2UpICsKICAjZ2VvbV9qaXR0ZXIoZGF0YT1kYXRhX2NyaXRpY2FsLGFlcyh5PWZlbGljaXR5X3JhdGluZyksYWxwaGE9LjUsY29sb3I9ImxpZ2h0Ymx1ZSIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gWU1pbiwgeW1heCA9IFlNYXgpLCB3aWR0aCA9IC4yNSwgcG9zaXRpb24gPSBkb2RnZSkgKwogIGxhYnMgKHg9IkNvbnRleHQgQ29uZGl0aW9uIiwgeT0gIkFmZmVjdCBSYXRpbmciLCBmaWxsID0gIkRBIFByZXNlbmNlIikgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIm5ldXRyYWxDRyIgPSAiQ29tbW9uIEdyb3VuZCIsICJuZXV0cmFsTm9DRyIgPSAiTm8gQ29tbW9uIEdyb3VuZCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArCiAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJGYW50YXN0aWNGb3gxIikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuNykpICsKICBmYWNldF93cmFwKH4gcmVwb3J0ZWRfdXNhZ2UpCmBgYAoKYGBge3IgcmVwb3J0ZWQgZmFtaWxpYXJpdHl9CmRhdGFfY3JpdGljYWwgJT4lIAogIGZpbHRlcihyZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMCIgfCByZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMSIgfCByZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMiIgfCByZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMyIgKSAlPiUKICBncm91cF9ieShEQV9wcmVzZW5jZSwgcmVwb3J0ZWRfZmFtaWxpYXJpdHksIGNvbnRleHRfY29uZGl0aW9uKSAlPiUKICBnZ3Bsb3QoYWVzKHg9YWZmZWN0X3JhdGluZyx5PWZlbGljaXR5X3JhdGluZywgY29sb3I9REFfcHJlc2VuY2UpKSArCiAgZ2VvbV9wb2ludCgpICsKICAjZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsgCiAgZ2VvbV9zbW9vdGgoKSArIAogIGxhYnMgKHg9IkFmZmVjdCBSYXRpbmciLCB5PSAiRmVsaWNpdHkgUmF0aW5nIiwgY29sb3IgPSAiREEgUHJlc2VuY2UiKSArCiAgI3NjYWxlX2NvbG9yX2Rpc2NyZXRlKGxhYmVscz1jKCJEQSIsICJubyBEQSIpLCB2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRmFudGFzdGljRm94MSIpWzI6NF0pICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArCiAgZmFjZXRfd3JhcCh+cmVwb3J0ZWRfZmFtaWxpYXJpdHkpCmBgYCAKCmBgYHtyfQpkYXRhX2NyaXRpY2FsICU+JQogIGdyb3VwX2J5KGNvbnRleHRfY29uZGl0aW9uLCBEQV9wcmVzZW5jZSwgcmVwb3J0ZWRfZmFtaWxpYXJpdHkpICU+JQogIHN1bW1hcml6ZShtZWFuX2FmZmVjdCA9IG1lYW4oYWZmZWN0X3JhdGluZyksIG1lYW5fZmVsaWNpdHkgPSBtZWFuKGZlbGljaXR5X3JhdGluZyksIHRyaWFsX3N1bSA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbWVhbl9hZmZlY3QsIHkgPSBtZWFuX2ZlbGljaXR5LCBjb2xvciA9IERBX3ByZXNlbmNlLCBzaGFwZSA9IGNvbnRleHRfY29uZGl0aW9uLCBzaXplID0gdHJpYWxfc3VtKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZmFjZXRfd3JhcCh+cmVwb3J0ZWRfZmFtaWxpYXJpdHkpCmBgYAoKYGBge3J9CiAgZGF0YV9jcml0aWNhbCAlPiUgCiAgI2ZpbHRlcihyZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMCIgfCByZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMSIgfCByZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMiIgfCByZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMyIgKSAlPiUKICBncm91cF9ieShEQV9wcmVzZW5jZSwgcmVwb3J0ZWRfZmFtaWxpYXJpdHkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlcG9ydGVkX2ZhbWlsaWFyaXR5LHk9ZmVsaWNpdHlfcmF0aW5nLCBmaWxsID0gREFfcHJlc2VuY2UpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogICNsYWJzICh4PSJJdGVtIFR5cGUiLCB5PSAiRmVsaWNpdHkgUmF0aW5nIiwgZmlsbCA9ICJEQSBQcmVzZW5jZSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGxhYmVscz1jKCJEQSIsICJubyBEQSIpKQpgYGAKCgoKYGBge3J9CiAgZGF0YV9jcml0aWNhbCAlPiUgCiAgI2ZpbHRlcihyZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMCIgfCByZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMSIgfCByZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMiIgfCByZXBvcnRlZF9mYW1pbGlhcml0eSA9PSAiMyIpICU+JQogIGdyb3VwX2J5KERBX3ByZXNlbmNlLCByZXBvcnRlZF9mYW1pbGlhcml0eSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVwb3J0ZWRfZmFtaWxpYXJpdHkseT1hZmZlY3RfcmF0aW5nLCBmaWxsID0gREFfcHJlc2VuY2UpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogI2xhYnMgKHg9Ikl0ZW0gVHlwZSIsIHk9ICJBZmZlY3QgUmF0aW5nIiwgZmlsbCA9ICJEQSBQcmVzZW5jZSIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGxhYmVscz1jKCJEQSIsICJubyBEQSIpKQpgYGAKCiMgRGF0YSBtb2RlbGluZwoKUmVsZXZlbGluZyAoY2hhbmdpbmcgcmVmZXJlbmNlIGxldmVsKSBhbmQgY2VudGVyaW5nIERBIHByZWRpY3RvciBhbmQgY29udGV4dCBjb25kaXRpb24gcHJlZGljdG9yCmBgYHtyfQpkYXRhX21vZGVsID0gZGF0YV9jcml0aWNhbCAlPiUgCiAgbXV0YXRlKGNvbnRleHRfY29uZGl0aW9uID0gZmN0X3JlbGV2ZWwoY29udGV4dF9jb25kaXRpb24sICJuZXV0cmFsTm9DRyIpKSAlPiUgCiAgbXV0YXRlKG51bURBX3ByZXNlbmNlID0gYXMubnVtZXJpYyhEQV9wcmVzZW5jZSksIG51bWNvbnRleHRfY29uZGl0aW9uID0gYXMubnVtZXJpYyhjb250ZXh0X2NvbmRpdGlvbikpICU+JSAKICBtdXRhdGUoY0RBX3ByZXNlbmNlID0gc2NhbGUobnVtREFfcHJlc2VuY2UpLCBjQ29udGV4dF9jb25kaXRpb24gPSBzY2FsZShudW1jb250ZXh0X2NvbmRpdGlvbikpCmBgYAoKCjEuIChPU0YgcHJlcmVnaXN0ZXJlZCBhbmFseXNpcykgTGluZWFyIG1peGVkIGVmZmVjdHMgYW5hbHlzaXMsIHByZWRpY3RpbmcgZmVsaWNpdHkgZnJvbSBhIGNlbnRlcmVkIHByZXNlbmNlIG9mIHRoZSBEQSBwcmVkaWN0b3IgYW5kIGEgY2VudGVyZWQgY29udGV4dCBjb25kaXRpb24gcHJlZGljdG9yLiBCeSBzdWJqZWN0IGFuZCBieSBpdGVtLCByYW5kb20gaW50ZXJjZXB0cyBhcyB3ZWxsIGFzIHJhbmRvbSBzbG9wZXMgZm9yIGNvbmRpdGlvbiBhbmQgREEgcHJlc2VuY2UuIAoKYGBge3IgZmVsaWNpdHkgbW9kZWx9CmZlbGljaXR5X21kbCA8LSBsbWVyKGZlbGljaXR5X3JhdGluZyB+IGNEQV9wcmVzZW5jZSpjQ29udGV4dF9jb25kaXRpb24gKyAoMSArIGNEQV9wcmVzZW5jZSArIGNDb250ZXh0X2NvbmRpdGlvbnx3b3JrZXJpZCkgKyAoMSArIGNEQV9wcmVzZW5jZSArIGNDb250ZXh0X2NvbmRpdGlvbnxpdGVtX3R5cGUpLCBkYXRhPWRhdGFfbW9kZWwsIFJFTUw9RikKc3VtbWFyeShmZWxpY2l0eV9tZGwpCmBgYAoKU2ltcGxlIHJlZ3Jlc3Npb25zIHRvIGFuYWx5emUgaW50ZXJhY3Rpb24gaW4gZmVsaWNpdHlfbWRsCmBgYHtyfQpmZWxpY2l0eV9tZGwuc2ltcGxlIDwtIGxtZXIoZmVsaWNpdHlfcmF0aW5nIH4gREFfcHJlc2VuY2UqY29udGV4dF9jb25kaXRpb24gLSBjb250ZXh0X2NvbmRpdGlvbiArICgxICsgREFfcHJlc2VuY2UgKyBjb250ZXh0X2NvbmRpdGlvbnx3b3JrZXJpZCkgKyAoMSArIERBX3ByZXNlbmNlICsgY29udGV4dF9jb25kaXRpb258aXRlbV90eXBlKSwgZGF0YT1kYXRhX21vZGVsLCBSRU1MPUYpCnN1bW1hcnkoZmVsaWNpdHlfbWRsLnNpbXBsZSkKYGBgCgpgYGB7cn0KZmVsaWNpdHlfbWRsLnNpbXBsZTEuMiA8LSBsbWVyKGZlbGljaXR5X3JhdGluZyB+IERBX3ByZXNlbmNlKmNvbnRleHRfY29uZGl0aW9uIC0gY29udGV4dF9jb25kaXRpb24gKyAoMSArIERBX3ByZXNlbmNlICsgY29udGV4dF9jb25kaXRpb258d29ya2VyaWQpICsgKDF8aXRlbV90eXBlKSwgZGF0YT1kYXRhX21vZGVsLCBSRU1MPUYpCnN1bW1hcnkoZmVsaWNpdHlfbWRsLnNpbXBsZTEuMikKYGBgCgoKYGBge3J9CmZlbGljaXR5X21kbC5zaW1wbGUyIDwtIGxtZXIoZmVsaWNpdHlfcmF0aW5nIH4gY29udGV4dF9jb25kaXRpb24qREFfcHJlc2VuY2UgLSBEQV9wcmVzZW5jZSArICgxICsgREFfcHJlc2VuY2UgKyBjb250ZXh0X2NvbmRpdGlvbnx3b3JrZXJpZCkgKyAoMSArIERBX3ByZXNlbmNlICsgY29udGV4dF9jb25kaXRpb258aXRlbV90eXBlKSwgZGF0YT1kYXRhX21vZGVsLCBSRU1MPUYpCnN1bW1hcnkoZmVsaWNpdHlfbWRsLnNpbXBsZTIpCmBgYAoKCjIuIExpbmVhciBtaXhlZCBlZmZlY3RzIGFuYWx5c2lzLCBwcmVkaWN0aW5nIGFmZmVjdCBmcm9tIGEgY2VudGVyZWQgcHJlc2VuY2Ugb2YgREEgcHJlZGljdG9yIGFuZCBhbmQgYSBjZW50ZXJlZCBjb250ZXh0IGNvbmRpdGlvbiBwcmVkaWN0b3IuIEJ5IHN1YmplY3QgYW5kIGJ5IGl0ZW0sIHJhbmRvbSBpbnRlcmNlcHRzIGFzIHdlbGwgYXMgcmFuZG9tIHNsb3BlcyBmb3IgY29uZGl0aW9uIGFuZCBEQSBwcmVzZW5jZS4gCgpgYGB7ciBhZmZlY3QgbW9kZWx9CmFmZmVjdF9tZGwgPC0gbG1lcihhZmZlY3RfcmF0aW5nIH4gY0RBX3ByZXNlbmNlKmNDb250ZXh0X2NvbmRpdGlvbiArICgxICsgY0RBX3ByZXNlbmNlICsgY0NvbnRleHRfY29uZGl0aW9ufHdvcmtlcmlkKSArICgxfGl0ZW1fdHlwZSksIGRhdGE9ZGF0YV9tb2RlbCwgUkVNTD1GKQpzdW1tYXJ5KGFmZmVjdF9tZGwpCmBgYAoKYGBge3J9CmFmZmVjdF9tZGwuc2ltcGxlIDwtIGxtZXIoYWZmZWN0X3JhdGluZyB+IERBX3ByZXNlbmNlKmNvbnRleHRfY29uZGl0aW9uIC0gY29udGV4dF9jb25kaXRpb24gKyAoMSArIERBX3ByZXNlbmNlICsgY29udGV4dF9jb25kaXRpb258d29ya2VyaWQpICsgKDF8aXRlbV90eXBlKSwgZGF0YT1kYXRhX21vZGVsLCBSRU1MPUYpCnN1bW1hcnkoYWZmZWN0X21kbC5zaW1wbGUpCmBgYAoKYGBge3J9CmFmZmVjdF9tZGwuc2ltcGxlMiA8LSBsbWVyKGFmZmVjdF9yYXRpbmcgfiBjb250ZXh0X2NvbmRpdGlvbipEQV9wcmVzZW5jZSAtIERBX3ByZXNlbmNlICsgKDEgKyBEQV9wcmVzZW5jZSArIGNvbnRleHRfY29uZGl0aW9ufHdvcmtlcmlkKSArICgxfGl0ZW1fdHlwZSksIGRhdGE9ZGF0YV9tb2RlbCwgUkVNTD1GKQpzdW1tYXJ5KGFmZmVjdF9tZGwuc2ltcGxlMikKYGBgCgpgYGB7cn0KZGF0YV9yZWdpb24gPSBkYXRhX21vZGVsICU+JSAKZmlsdGVyKHJlZ2lvbl9jb3VudHJ5ID09ICJhcmdlbnRpbmEiIHwgcmVnaW9uX2NvdW50cnkgPT0gIm1leGljbyIgfCByZWdpb25fY291bnRyeSA9PSAic3BhaW4iIHwgcmVnaW9uX2NvdW50cnkgPT0gInVzYSIgfCByZWdpb25fY291bnRyeSA9PSAidmVuZXp1ZWxhIikKYGBgCgoKYGBge3J9CnJlZ2lvbl9tZGwgPC0gbG1lcihmZWxpY2l0eV9yYXRpbmcgfiBjREFfcHJlc2VuY2UqY0NvbnRleHRfY29uZGl0aW9uICsgcmVnaW9uX2NvdW50cnkgKyAoMSArIGNEQV9wcmVzZW5jZSArIGNDb250ZXh0X2NvbmRpdGlvbnx3b3JrZXJpZCkgKyAoMSArIGNEQV9wcmVzZW5jZSArIGNDb250ZXh0X2NvbmRpdGlvbnxpdGVtX3R5cGUpLCBkYXRhPWRhdGFfcmVnaW9uLCBSRU1MPUYpCnN1bW1hcnkocmVnaW9uX21kbCkKYGBgCgo=